我可以参考Linq to Sql查询中的计算列吗?

问题描述:

我有以下模式:我可以参考Linq to Sql查询中的计算列吗?

product 
- productID (PK) 
- name 
- units 

purchase 
- purchaseID (PF) 
- productID (FK) 
- soldUnits 
- woUnits 

boxContents 
- boxID (PK) 
- puchaseID (FK) 
- count 

及以下的LINQ to SQL查询:

var qStockLevel = from pr in db.products 
    select new 
    { 
     pr.productID, 
     pr.name, 
     totalUnits = (from pu in db.purchases 
         where pu.productID == pr.productID 
         select pu).Count() * pr.units, 

    sold = (from pr2 in db.products 
      join pu in db.purchases on pr.productID equals pu.productID into pp 
      where pr2.productID == pr.productID 
      from pu2 in pp.DefaultIfEmpty() 
      select (int?) pu2.soldUnits ?? 0).Sum(), 

    writtenOff = (from pr2 in db.products 
       join pu in db.purchases on pr.productID equals pu.productID into pp 
       where pr2.productID == pr.productID 
       from pu in pp.DefaultIfEmpty() 
       select (int?)pu.woUnits ?? 0).Sum(), 

    onDisplay = (from pr2 in db.products 
       join bc in db.boxContents on pr.productID equals bc.purchase.productID into bp 
       where pr2.productID == pr.productID 
       from bc in bp.DefaultIfEmpty() 
       select (int?)bc.count ?? 0).Sum(), 

    available = (totalUnits - sold - writtenOff - onDisplay), 
}; 

末的“可用”列不工作,但我已经将它纳入到说明了我想要达到的目标 - 从已经生成的列中计算出的列。这可能吗?我可以在表示层做到这一点,但想要检查这是否会首先工作。

而且 - 我的(新LINQ)眼睛,查询,因为我在生成writtenOff和销售列在重复自己看上去效率低。当我有涉及的聚集功能时,有没有更好的方法来实现这一点。

谢谢。

编辑

一两件事 - 我只是想回到这里的“可用”行> 0

做第二次选择新{}最后一行(你必须再次复制你需要在第二选择所有领域),然后添加一个where子句

编辑:没有真正相关,但它看起来像你可以受益于一个新列保存可用的值(Linq To Sql和INotityPropertyChanging,它应该是很容易实现)

这里有一个查询,应该做你想要什么。

(注:这假定您已经设置了Product之间的关联 - >Purchases - 在您的DBML设计师>BoxContents。)

var query = from product in context.Products 
      where 
      (
       product.Purchases.Count() * product.units - 
       product.Purchases.Sum(purchase => purchase.soldUnits ?? 0) - 
       product.Purchases.Sum(purchase => purchase.woUnits ?? 0) - 
       product.Purchases.SelectMany(purchase => purchase.BoxContents).Sum(bc => bc.count ?? 0) 
      ) > 0 
      select product; 

而且,仅供参考,这里就是你可以建立一个这样你Product类。

(您可能需要使用DataLoadOptions.LoadWith()跃跃欲试负荷Product的孩子。)

public partial class Product 
{ 
    public int TotalUnits 
    { 
     get { return this.Purchases.Count * this.units ?? 0; } 
    } 

    public int Sold 
    { 
     get { return this.Purchases.Sum(p => p.soldUnits ?? 0); } 
    } 

    public int WrittenOff 
    { 
     get { return this.Purchases.Sum(p => p.woUnits ?? 0); } 
    } 

    public int OnDisplay 
    { 
     get { return this.Purchases.SelectMany(p => p.BoxContents).Sum(b => b.count ?? 0); } 
    } 

    public int Available 
    { 
     get { return TotalUnits - Sold - WrittenOff - OnDisplay; } 
    } 
}