Linq Outer Joins - 不想要DefaultIfEmpty,而是想要NullIfEmpty

时间:2012-08-11 21:28:44

标签: linq dynamics-crm-2011

所有

此问题与Dynamics CRM 2011 Linq提供程序有关 - 它确实有很多怪癖。但是,我没有标记它,例如我认为这是一个普通的Linq问题。

我有一个类 - 产品。它有一个属性(比如ProductPrice),类型为Price。

我正在Linq进行外部加入。 CRM文档说外连接是不可能的,但它似乎工作(我在这里问的明显问题)。

所以说我做的事情是:(为伪linq道歉)

        IList<Product> products = (from p in xrmContext.Products 
                                  join pr in xrmContext.Prices
                                  on p.ProductId equals pr.ProductId into prx from prices in prx.DefaultIfEmpty
                                  select new Product { ProductName = p.productName, ProductPrice = new Price { Amount = prices.PriceValue }).ToList();

这很有用。它创造了所有产品,无论它们是否具有价格对象。 Tippety顶部。

问题是DefaultIfEmpty。毫无疑问,如果产品没有价格,DefaultIfEmpty会创建一个默认的&#39;价格对象...即具有空值的对象。我实际上想要的是没有价格对象 - 即空,而不是空白&#39;对象

这怎么可能?

我通过测试空白价格名称来解决这个问题 - ProductPrice = price.priceName ==&#34;&#34; ? null:新价格......

能够做一些像NullIfEmpty这样的事情会很棒。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以跳过加入:

from p in xrmContext.Products 
let price = xrmContext.Prices.FirstOrDefault(pr => pr.ProductID == p.ProductID)
select new Product()
{ 
    ProductName = p.productName,
    ProductPrice = price != null ? new Price() { Amount = price.PriceValue } : null
}

答案 1 :(得分:0)

crm 2011 linq不支持外连接。 如果您尝试Amiram的代码 - 在评估选择时,您将收到错误“产品不包含属性”pricevalue“”。