2010-10-04 87 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