2010-10-04 60 views
5

我试图让这个LINQ工作,但失败的错误。与GroupBy LINQ错误

无法转换lambda表达式键入“System.Collections.Generic.IEqualityComparer”,因为它不是一个委托类型

基本上我有IEnumerable<DataRow>和我想要对数据进行分组,如:

string sql = @"SELECT [t0].[Contact_Account] AS [Contact], [t0].[Work_Phone] AS [WorkPhone], [t0].[SR_NUM] AS [SRNum] "; 
sql += "FROM [Base_SR] AS [t0] "; 
sql += "WHERE ([t0].[Country] = 'USA') AND (NOT ([t0].[Work_Phone] LIKE '+%')) "; 
sql += "AND ([t0].[Product] = 'SP3D') AND (DATEPART(Year, [t0].[DateOpened]) = {0})"; 

sql = String.Format(sql, curYear); 

var sqlCmd = new SqlCommand(sql, new SqlConnection(connectionString)); 
var adapter = new SqlDataAdapter(sqlCmd); 
var dataSet = new DataSet(); 
adapter.Fill(dataSet); 
var siebelRows = dataSet.Tables[0].AsEnumerable(); 

return siebelRows.GroupBy(sr => new { AreaCode = sr.Field<string>("WorkPhone").Substring(0, 3), 
      Contact = sr.Field<string>("Contact") }, 
    (key, lst) => new Customer 
    { 
         Id = Guid.NewGuid(), 
     AreaCode = key.AreaCode, 
     CustAccount = key.Contact, 
     FirstPhoneNo = lst.First().Field<string>("WorkPhone").Substring(0, 10), 
     FirstSRNum= lst.First().Field<string>("SRNum"), 
     SRCount = lst.Count() 
    }) 
    .Take(5); 

有什么想法?

DigEmAll的建议帮助(谢谢),我不得不这样做:

public class GroupKey 
{ 
    public string AreaCode { get; set; } 
    public string Contact { get; set; } 
} 

,然后更改LINQ到这个GroupBy键:

GroupBy<DataRow, GroupKey, IEnumerable<Customer>>

return siebelRows.GroupBy<DataRow, GroupKey, IEnumerable<Customer>>(sr => new GroupKey 
{ 
    Contact = sr.Field<string>("Contact"), 
    AreaCode = sr.Field<string>("WorkPhone").Substring(0, 3) 
}, 
    (key, lst) => new Customer 
     { 
      Id = Guid.NewGuid(), 
      AreaCode = key.AreaCode, 
      CustAccount = key.Contact, 
      FirstPhoneNo = lst.First().Field<string>("WorkPhone").Substring(0, 10), 
      FirstSRNum = lst.First().Field<string>("SRNum"), 
      SRCount = lst.Count() 
     }).OrderByDescending(c => c.SRCount) 
     .Take(5); 

不喜欢创造一个关键的具体类型......任何方式围绕?

+0

好像LINQ正在寻找第二个过载一个需要的IEqualityComparer公共静态的IEnumerable >的GroupBy ( 此IEnumerable的源, Func键的KeySelector, 的IEqualityComparer 比较器); – Sunit 2010-10-04 19:02:30

回答

3

我觉得你的问题是在Field<T>在匿名类型定义。

您应该指定类型T(不能根据使用情况推断),然后编译器会识别正确的GroupBy过载。


根据OP改变编辑:

你并不需要创建一个具体类型,只是在Field<T>(...)明确指定权T,所以在你的代码:

sr => new { AreaCode = sr.Field<string>("WorkPhone").Substring(0, 3), 
      Contact = sr.Field<string>("Contact") } 

编辑2:

好吧,我已经编辑了你的问题,因为实际上你的<...>被隐藏了(手动使用<code><pre>,只需点击相应的按钮;-))。

反正你最后的代码中有一个错误在GroupBy种规格:

<DataRow, GroupKey, IEnumerable<Customer>>

<DataRow, GroupKey, Customer>

,因为你只需要指定返回IEnumerable的内部类型。

然后,我已经试过你最后的代码,同时也消除了具体类型GroupKey(显然取出的GroupBy种规格),这是完全合法:

var customers = siebelRows.GroupBy( 
    sr => new 
    { 
     Contact = sr.Field<string>("Contact"), 
     AreaCode = sr.Field<string>("WorkPhone").Substring(0, 3) 
    }, 
    (key, lst) => new Customer 
    { 
     Id = Guid.NewGuid(), 
     AreaCode = key.AreaCode, 
     CustAccount = key.Contact, 
     FirstPhoneNo = lst.First().Field<string>("WorkPhone").Substring(0, 10), 
     FirstSRNum = lst.First().Field<string>("SRNum"), 
     SRCount = lst.Count() 
    }) 
    .OrderByDescending(c => c.SRCount) 
    .Take(5); 
return customers; 
+0

好点,我错过了。但在这种情况下,编译器不显示错误的实际原因 – 2010-10-04 19:27:33

+0

或者OP也许没有注意到它?我不知道我在猜测... – digEmAll 2010-10-04 19:29:27

+0

@Sunit:检查我的编辑;) – digEmAll 2010-10-04 19:39:32

1

您混合了您的GroupBy和Select。 请尝试以下的变通(寻找到您所使用的过载):

return siebelRows.GroupBy(sr => new 
          { 
           AreaCode = sr.Field("AreaCode") 
              .Substring(0, 3), 
           Contact = sr.Field("Contact") 
          }) 
       .Select(kvp => new Customer 
           { 
            Id = Guid.NewGuid(), 
            AreaCode = kvp.Key.AreaCode, 
            CustAccount = kvp.Key.Contact, 
            // rest of the assignment 
           } 
       .Take(5); 
+0

您的解决方案应该返回预期的结果,但实际上我认为OP正在尝试使用[此GroupBy重载](http://msdn.microsoft.com/en-us/library/bb549393.aspx),所以他不是真的“混合”什么...我不明白为什么原来的代码不编译我使用的GroupBy公共静态的IEnumerable超载 – 2010-10-04 18:57:17

+0

>的GroupBy​​( 这IEnumerable的源, Func键的KeySelectors, Func elementSelector); – Sunit 2010-10-04 19:00:07

+0

托马斯击败了我的解释(: – Sunit 2010-10-04 19:00:36