Linq to sql 我可以引用Linq to Sql查询中的计算列吗?

Linq to sql 我可以引用Linq to Sql查询中的计算列吗?,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到SQL查询: var qStockLevel = from pr in db.products

我有以下模式:

product  
- productID (PK)  
- name  
- units  

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

boxContents  
- boxID (PK)  
- puchaseID (FK)  
- count
以及以下Linq到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),
};
末尾的“available”列不起作用,但我已经包含它来说明我试图实现的内容——一个根据已经生成的列计算的列。这可能吗?我可以在表示层进行,但我想先检查一下这是否可行

另外,在我(Linq新手)看来,当我重复生成writenoff和sell列时,查询看起来效率很低。当涉及聚合函数时,有没有更好的方法来实现这一点

谢谢

编辑


还有一件事-我只想返回“可用”大于0的行

对最后一行执行第二次select new{}(您必须再次复制第二次select中需要的所有字段),然后添加where子句


EDIT:虽然不太相关,但看起来您可以从一个包含可用值的新列中获益(使用Linq To Sql和InotityPropertyChange,这应该很容易实现)

这里有一个查询,它可以满足您的需要

(注意:这假设您已经在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;
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; }
    }
}