2013-02-26 73 views
1

使用C#4和EF5。Linq to Entities Group Sum计算的属性

有麻烦,试图总结计算特性:

The specified type member 'QtyAvailable' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported. 

下面是属性定义:

public decimal QtyAvailable 
    { 
     get 
     { return this.QtyInContainer - this.QtyAllocated; } 
    } 

这里是LINQ的:

var viewModel = 
       companyItems 
         .GroupJoin(
          inventory, 
          items => items.Id, 
          inven => inven.ItemId, (im, icd) => new { im, icd } 
          ) 
         .SelectMany(
          itemInven => itemInven.icd.DefaultIfEmpty(), 
          (im, icd) => new { im, icd } 
         ) 
         .GroupBy(g => new 
          { 
           g.im.im.Id 
          } 
         ) 
         .Select(group => 
           new ItemAvailabilityViewModel() 
           { 
            Id = group.Key.Id, 
            QtyAvailable = group.Sum(jt => jt.icd == null ? 0 : jt.icd.QtyAvailable), 
            UnitCashPrice = group.Max(jt => jt.im.im.UnitSellPrice), 
            UnitCreditPrice = group.Max(jt => jt.im.im.UnitSellPrice * (1 + company.CashDiscountPct)), 
            CustomerUnitPrice = group.Max(jt => jt.im.im.UnitSellPrice * (1 + decCreditPriceMarkup)) 
           } 
         ) 
         ; 

不知道如何实现这个结果。我需要以某种方式将其分解为2个查询吗?

回答

2

看起来像把这个分解成2个查询就是票。从我猜想发生的事情来看,第一次,当你调用.ToList()时,它解析了计算的属性,使得它本质上不再为第二个查询计算然后求和。这里是结果代码:

//join of Recpt Header and Detail 
      var unGroupedJoin = 
       companyItems 
         .GroupJoin(
          inventory, 
          items => items.Id, 
          inven => inven.ItemId, (im, icd) => new { im, icd } 
          ) 
         .SelectMany(
          itemInven => itemInven.icd.DefaultIfEmpty(), 
          (im, icd) => new { im, icd } 
         ).ToList(); 

      var viewModel = 
       unGroupedJoin 
         .GroupBy(g => new 
          { 
           g.im.im.Id 
          } 
         ) 
         .Select(group => 
           new ItemAvailabilityViewModel() 
           { 
            Id = group.Key.Id, 
            QtyAvailable = group.Sum(jt => jt.icd == null ? 0 : jt.icd.QtyAvailable), 
            UnitCashPrice = group.Max(jt => jt.im.im.UnitSellPrice), 
            UnitCreditPrice = group.Max(jt => jt.im.im.UnitSellPrice * (1 + company.CashDiscountPct)), 
            CustomerUnitPrice = group.Max(jt => jt.im.im.UnitSellPrice * (1 + decCreditPriceMarkup)) 
           } 
         ).ToList() 
         ;