2012-07-30 92 views
1

目前我在两张表上执行join,结果可能是多行。这个lambda表达式的返回类型应该是什么?

返回类型为IList<string>目前,但我得到一个错误

错误:

Cannot implicitly convert type System.Collections.Generic.List<AnonymousType#1> to System.Collections.Generic.IList<string> 

这里是我的表达

public IList<string> GetPendingSubGroups() 
{ 
    using (var db = new DataClasses1DataContext()) 
    { 
     var pendingSubGroup = 
      db.sys_Log_Account_SubGroups.Where(subGroup => subGroup.cAuthorizedStatus.Equals("Pending")).Join(
       db.sys_Account_Primary_Groups, subGroup => subGroup.nGroupCode, group => group.nGroupCode, 
       (subGroup, group) => new 
             { 
              cSubGroupName = subGroup.cSubGroupName, 
              cAddedBy = subGroup.cAddedBy, 
              dAddedOn = subGroup.dAddedOn 
             }).ToList(); 
     return pendingSubGroup; 
    } 
} 

谁能帮我这个?

+1

您正在创建一个匿名类型的列表。你打算如何从每个实例创建一个字符串? – Lee 2012-07-30 10:49:52

+1

您具有创建具有三个属性(cSubGroupName,cAddedBy,dAddedOn)的对象的投影。你如何期待这些物体变成弦乐? – 2012-07-30 10:49:58

+0

@我现在明白了,现在我将创建一个类来表示我的结果。谢谢。 – freebird 2012-07-30 10:58:07

回答

4

创建一个类来表示你的结果

public class SubGroup 
{ 
    public string Name {get; set;} 
    public string AddedBy {get; set;}   
    public DateTime AddedOn {get; set;} 
} 

,并返回埋该类

public IList<SubGroup> GetPendingSubGroups() 
    { 
     using(var db=new DataClasses1DataContext()) 
     { 
      var pendingSubGroup = db.sys_Log_Account_SubGroups.Where(subGroup => subGroup.cAuthorizedStatus.Equals("Pending")).Join(db.sys_Account_Primary_Groups, subGroup => subGroup.nGroupCode, group => group.nGroupCode,(subGroup, group) => new SubGroup 
      { 
       Name = subGroup.cSubGroupName, 
       AddedBy = subGroup.cAddedBy, 
       AddedOn = subGroup.dAddedOn 
      }).ToList(); 
      return pendingSubGroup; 
     } 
    } 

注意到这一变化的列表在linq

(subGroup, group) => new *SubGroup* 
      { 
       Name = subGroup.cSubGroupName, 
       AddedBy = subGroup.cAddedBy, 
       AddedOn = subGroup.dAddedOn 
      }).ToList(); 
+0

这似乎是一个很好的解决方案,我会试试这个。我明白我做错了什么。感谢队友。 – freebird 2012-07-30 10:55:10

+0

没问题,很高兴我能帮上忙。 – NinjaNye 2012-07-30 11:00:37

3

您在这里使用Select投影方法创建Anonymous Type

new 
{ 
    cSubGroupName = subGroup.cSubGroupName, 
    cAddedBy = subGroup.cAddedBy, 
    dAddedOn = subGroup.dAddedOn 
} 

类型由编译器创建的(如具有只读属性的类)。此例中的属性名称是cSubGroupName,cAddedBydAddedOn

如果您需要返回string,也许您需要返回其中一个属性而不是整个类型?

您将无法实现匿名类型和字符串之间的转换,因此您可能需要不首先创建类型,只需选择字符串属性即可。

如果需要返回一个类型,而不仅仅是一个string,然后只需创建一个自定义类与此属性和,而不是把一个匿名类型,让你的类的实例,如NinjaNye's answer

+0

感谢您的解释,我想我会与NinjaNye的解决方案,因为我需要所有的属性,即cSubGroupNane,cGroupName,cAddedBy,dAddedOn.Thanks。 – freebird 2012-07-30 11:00:14

2

的错误信息几乎说明了一切,你返回匿名类型的列表:

(subGroup, group) => new 
{ 
    cSubGroupName = subGroup.cSubGroupName, 
    cAddedBy = subGroup.cAddedBy, 
    dAddedOn = subGroup.dAddedOn 
} 

如果你只是想在SubGroupName:

(subGroup, group) => subGroup.cSubGroupName 
+0

雅我明白了错误,我需要所有的三个属性,所以你认为NinjaNye的解决方案是有用的。谢谢。 – freebird 2012-07-30 10:56:28

2

返回类型是一个匿名类型。您应该创建与属性的新类,并使用它像这样:

public IList<SomeClass> GetPendingSubGroups() 
    { 
     using(var db=new DataClasses1DataContext()) 
     { 
      var pendingSubGroup = db.sys_Log_Account_SubGroups 
      .Where(subGroup => subGroup.cAuthorizedStatus.Equals("Pending")) 
      .Join(db.sys_Account_Primary_Groups, subGroup => subGroup.nGroupCode, group => group.nGroupCode,(subGroup, group) => new SomeClass(subGroup.cSubGroupName, subGroup.cAddedBy, subGroup.dAddedOn)).ToList(); 

      return pendingSubGroup; 
     } 
    } 

但好像你只是想返回一个字符串?在这种情况下,你可以投射只是一个字段:

return pendingSubGroup.Select(p => p.cSubGroupName).ToList(); 
+1

我需要所有的属性。感谢您的帮助。 – freebird 2012-07-30 10:57:08

1

你可以返回IList。但是,每次尝试使用它时都必须打开包装。我不会建议这样做。这是更好地定义你自己在返回它

+0

感谢您的建议,我正在创建一个班。谢谢。 – freebird 2012-07-30 11:12:22

1

前面已经回答,您可以创建由三个属性组成的匿名类型的类:

cSubGroupName 
cAddedBy 
dAddedOn 

如果SubGroupName是你想要得到的东西,那么你就可以或修正您的问题

public IList<string> GetPendingSubGroups() 
     { 
      using(var db=new DataClasses1DataContext()) 
      { 
       var pendingSubGroup = db.sys_Log_Account_SubGroups.Where(subGroup => subGroup.cAuthorizedStatus.Equals("Pending")).Join(db.sys_Account_Primary_Groups, subGroup => subGroup.nGroupCode, group => group.nGroupCode,(subGroup, group) => subGroup.cSubGroupName).ToList(); 
       return pendingSubGroup; 
      } 
     } 
+0

谢谢,我需要所有三个,谢谢。 – freebird 2012-07-30 11:01:06

相关问题