2010-10-18 74 views
1

我想使用連接(...)擴展方法來建立一個基於傳遞給方法的標準的查詢。我有如下的錯誤:在加入擴展方法問題實現加入(...)擴展方法

public static IQueryable QueryItems(string param1, string param2, string param3) 
{ 
    IQueryable<tbl_Item> query = dataMap.tbl_ItemMap; 

    //Join is giving me the error: Cannot implicitly convert type 
    //System.Linq.IQueryable<AnonymousType#1> to System.Linq.IQueryable<tbl_Item>. 
    //An explilct conversion exists 
    query = query.Join(dataSet.Tables["tbl_Resource"].AsEnumerable(), 
      q => q.OriginalResourceID, 
      r => r.Field<int>("ResourceID"), 
      (q, r) => new { q, r }); 

    if (!String.IsNullOrEmpty(param1)) 
     query = query.Where(...); 

    if (!String.IsNullOrEmpty(param2)) 
     query = query.Where(...); 

    if (!String.IsNullOrEmpty(param3)) 
     query = query.Where(...); 

    var results = query.Select(result => new 
    { 
     Origin = result.OriginalResourceID, // needs to be a name from Tables["tbl_Resource"] 
     Current = result.CurrentResourceID, // needs to be a name from Tables["tbl_Resource"] 
     ..., 
     ..., 
    }); 

    return results; // results are displayed in a DataGridView 
} 

補充資料表明:

'a is new {tbl_Item q, DataRow r} 

我明白,這是最有可能的問題。這是否意味着將DataTables保存在內存中用於查找這樣的內容毫無意義? 「tbl_Resource」包含4列,其中2列是ResourceID(關鍵字)和一個資源名稱(我想推送到Select擴展方法)。

我不會太天真,並相信我正在實施最好的(讀取效率最高的)邏輯。如果這是最好的解決方案,我可以爲Join方法創建一個字典;但是,這似乎會給我現在的錯誤。

任何想法?

+0

我想我只是指出,你缺少一個'extension'方法的關鍵位,這是'this'參數指定哪種類型的擴展方法適用於。你的簽名應該是這樣的:'public static IQueryable QueryItems(this IQueryable someQuery,string param1,string param2,string param3)' – Strelok 2010-10-19 04:39:43

+0

我寫的方法不是擴展方法。不過謝謝... – IAbstract 2010-10-19 14:43:10

回答

1

您正試圖爲您的query變量分配不同類型的值。怎麼樣是這樣的:

public static IQueryable QueryItems(string param1, string param2, string param3) 
{ 

    var query = dataMap.tbl_ItemMap 
     .Join(dataSet.Tables["tbl_Resource"].AsEnumerable(), 
      q => q.OriginalResourceID, 
      r => r.Field<int>("ResourceID"), 
      (q, r) => new { q, r }); 
    ... 

編輯

使用上述方法的語法可能會很麻煩,一旦你有一些在聯接一次發生。您可能想切換到查詢語法以使事情變得更簡單。它最終可能會看起來像這樣:

var query = from i in dataMap.tbl_ItemMap 
      join r in dataSet.Tables["tbl_Resource"].AsEnumerable() 
       on i => i.OriginalResourceId equals r.Field<int>("ResourceId") 
      join t in dataSet.Tables["tbl_Type"].AsEnumerable() 
       on i => i.TypeId equals t.Field<int>("TypeId") 
      ... 
      select new { 
       Origin = r.Title, 
       Type = t.Title, 
       ... 
      }; 
+0

這基本上是一回事。因爲'tbl_ItemMap'由幾個keyID列組成,所以我會有多個連接。 – IAbstract 2010-10-18 19:47:29

+0

它會修復您提到的錯誤,因爲您正在使用的'query'變量被聲明爲具有匿名類型。我不知道你有多個連接意味着什麼。請嘗試我的建議,並提供一個清楚的解釋,說明爲什麼它不適合你。 – StriplingWarrior 2010-10-18 19:58:27

+0

我的錯誤...我會給這個鏡頭。我將'query'聲明爲'IQueryable '。我的意思是多個連接是源數據映射'tbl_ItemMap'有很多keyID列:CurResID,OrigResID,TypeID等。我將不得不將這些keyID列連接到不同的表,以便DataGridView中顯示有意義的數據。 。合理? – IAbstract 2010-10-19 03:40:03