2010-11-06 46 views
3

我一直在嘗試使用Join和GroupJoin方法。問題看起來很簡單。鑑於TableATableB的數據地圖這樣的:正確加入/組加入執行

class MyDataContext : DataContext 
{ 
    public Table<tblA> TableA; 
    public Table<tblB> TableB; 
} 

...我使用TableA作爲我的主表,並想加入一個領域,在CustomerIDTableB檢索[TableB].[LastName]

應該不困難,除非我難以使結果正常工作。無論TableB中匹配的CustomerID如何,TableA都有我想要的記錄。聽起來像一個左連接 - 所以,閱讀here,我模仿什麼@tvanfosson建議:

// appropriately rewritten for my needs - so I thought... 
private static IQueryable GetRecordsByView1(IQueryable<tblA> source) 
{ 
    var records = source.GroupJoin(myContext.TableB, 
        info => info.CustomerID, 
        owner => owner.CustomerID, 
        (info, owner) => new 
        { 
         info.CustomerID, 
         Owner = owner.Select(o => o.LastName).DefaultIfEmpty(), 
         Store = info.Store, 
        }) 
        .Select(record => new 
        { 
         record.CustomerID, 
         record.Owner, 
         record.Store, 
        }); 

    return records; 
} 

source是動態的,這樣的一個方法生成動態查詢:

public static void QueryStores() 
{ 
    IQueryable<tblA> source = myContext.TableA; 

    if (criteriaA) 
     source = source.Where(// something); 

    if (criteriaB) 
     source = source.Where(// something); 

    // after processing criteria logic, determine type of view 
    switch (byView) 
    { 
     case View1: 
     { 
      source = GetRecordsByView1(source); 
      break; 
     } 

     //other case blocks 
    } 

    myGridView.DataSource = source; 
} 

的問題:我接收以下錯誤:

Could not format node 'OptionalValue' for execution as SQL.

我相信這是在下面的代碼行:

Owner = owner.Select(o => o.LastName).DefaultIfEmpty() 

我在這裏做錯了什麼?我必須寫作GroupJoin作爲擴展方法。

回答

2

第一...... @布賴恩讓我開始了正確的軌道。這裏是解決方案:

var records = source 
       .GroupJoin(myContext.TableB, 
       info => info.CustomerID, 
       owner => owner.CustomerID, 
       (info, owner) => new 
       { 
        info, 
        Owner = owner.Select(o => o.LastName).First() 
       }) 
       .Select(record => new 
       { 
        record.info.CustomerID, 
        record.Owner, 
        record.info.Store 
       }); 

這爲我提供了所需的確切結果...

-1

看看這個左外連接例子:http://msdn.microsoft.com/en-us/library/bb397895.aspx

相關樣本:

var query = from person in people 
join pet in pets on person equals pet.Owner into gj 
from subpet in gj.DefaultIfEmpty() 
select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) } 

你可以加入結果爲GJ,然後使用DefaultIfEmpty創建外連接的情況下,仍能獲得你想要的結果。 Max or Default? http://blog.appelgren.org/2008/05/15/linq-to-sql-aggregates-and-empty-results/

HTH:

別人利用這裏得到DefaultIfEmpty類似的錯誤。

+0

的問題是,我必須寫我的'Join'作爲一個擴展方法。我不能寫成LINQ語句。 – IAbstract 2010-11-08 15:15:43

3

你是對的,Owner = owner.Select(o => o.LastName).DefaultIfEmpty()是導致你的問題的線。我想出了最好的解決方法是這樣的:

var records = source.GroupJoin(myContext.TableB, 
        info => info.CustomerID, 
        owner => owner.CustomerID, 
        (info, owner) => new { info, owner }).ToList(); 
records.Select(x => new 
        { 
         x.info.CustomerID, 
         Owner = x.owner.First() == null ? new string[] {} : x.owner.Select(o => o.LastName).ToArray(), 
         Store = x.info.Store, 
        }) 
        .Select(record => new 
        { 
         record.CustomerID, 
         record.Owner, 
         record.Store, 
        }); 

這當然是不理想(你必須兌現與「ToList」的羣組加入),並有可能是一個更好的解決方案,但已經爲我工作。你可能需要花一點時間才能讓它適合你,但我希望這可以幫助你一路順風。

+0

這看起來很有希望。我確實看到它看起來似乎沒有實現數據 - 我開始明白這一點。刪除'DefaultIfEmpty()'後,查詢通過,但所有者結果爲空。我進入結果,業主姓在那裏,但埋葬。所以我知道我很接近......謝謝。 – IAbstract 2010-11-08 16:39:02

+0

+1讓我的思維走上正軌。 – IAbstract 2010-11-08 17:10:46