2011-07-14 52 views
0

我在使用linq进行左/右连接时遇到问题。sql左linq lampda表达式加入

我可以说

public class Customer 
{ 
    prop string CustomerId { get; set; } 
    prop string LanguageGuid { get; set; } 
} 

public class ReadOnlyCustomer 
{ 
    prop string CustomerId { get; set; } 
    prop string LanguageGuid { get; set; } 
} 

我在ReadonlyCustomer表中的很多客户。 在我的情况下,我没有客户表中的所有客户。 所以我不能使用加入,我不是什么内部加入。 我需要左或右连接。

var test = db.Customer.Join(db.ReadOnlyCustomer, p => p.CustomerId, o => o.CustomerId, (c, o) => new ReadOnlyCustomer() { CustomerId = c.CustomerId, LanguageGuid = o.LanguageGuid ?? c.LanguageGuid }); 

在这一点上,我得到一个空指针,因为查询不能加入一个空引用。

我该如何做一个左连接等于sql左连接,其中我得到的数据源中不存在NULL值为NULL。

这需要在lampda不comprehensing类似语法(邻中....)

//丹尼斯

+0

为什么要求它不能在'comprehensing'语法中?我所知道的唯一简单的解决方案只适用于'理解'语法:http://codingsense.wordpress.com/2009/03/08/left-join-right-join-using-linq/ – mellamokb

回答

4

您需要结合使用GroupJoin,有时一个电话DefaultIfEmpty()事后为该组分配一个空值。然后可以使用SelectMany()以每对结果为一个结果,注意结果中的一个值可能为空。

例如:

// Note: can only do a *left* join, so "bigger" table comes first 
var test = db.ReadOnlyCustomer 
      .GroupJoin(db.Customer, 
         p => p.CustomerId, 
         o => o.CustomerId, 
         (p, os) => new { p, os = os.DefaultIfEmpty() }) 
      // Each pair may have multiple os here 
      .SelectMany(pair => pair.os.Select(o => new { pair.p, o })) 
      // Flattened, but o may be null 
      .Select(pair => new ReadOnlyCustomer { 
         CustomerId = pair.p.CustomerId, 
         LanguageGuid = o != null ? o.LanguageGuid ?? p.LanguageGuid 
               : p.LanguageGuid 
        }); 

(出于兴趣,为什么这是否需要在lambda语法,而不是作为一个查询表达式通常加入各种更简单来表达查询表达式? )

+0

Thx,这个工作很好。 。回答你感兴趣的问题:我需要在它激发之前动态地向查询添加更多表达式。我只想用其中一种方式来做到这一点,否则它看起来不那么好。我确实想要学习如何以这种形式进行查询。我在谷歌上找到解决方案并没有成功,但我们没有达到最佳效果:P –