Linq Query with join on subquery

时间:2013-05-14 23:33:25

标签: c# linq

基本上我正在尝试编写一个查询,它连接到第二个表中的select top 1,如下所示:

SELECT Sum(pinfo.quantity + p.itemcount), 
   i.owner 
FROM   invoice i 
   JOIN purchase_info pinfo 
     ON pinfo.invoice = i.invid 
   JOIN (SELECT DISTINCT sku, 
                         productlineid, 
                         itemcount 
         FROM   products WHERE productlineid in (13, 14)) p 
     ON p.sku = pinfo.item 
WHERE i.owner = 22623 
GROUP BY i.owner

这是我在linq中的可怜尝试,其语法有些无效,任何想法都会非常感激。

(from i in _invoiceRepository.Table
 join pi in _purchaseInfoRepository.Table on i.InvoiceId equals pi.InvoiceId
 join p in (from p2 in _productRepository.Table where p2.Sku == pi.Item select new { p2.Sku, p2.ItemCount }).Take(1)
 on pi.Item equals p.Sku

 where i.MemberId == memberId &&
 (p.ProductLineId == (int)ProductLines.InkCartridges ||
  p.ProductLineId == (int)ProductLines.TonerCartridges)
 select pi.Quantity * p.ItemCount)
.DefaultIfEmpty(0)
.Sum();

1 个答案:

答案 0 :(得分:1)

这是我对此的第一次尝试。

从sql中,您可能希望找到特定客户从中订购过多少墨水和碳粉盒。

这应该给你与sql相同的结果(这取决于Products表的顺序,因为我们在没有完成某种排序的情况下占据前1名:

  var count = from i in _invoiceRepository.Table
              where i.OwnerId == memberId
              select new
                {
                  OwnerId = i.OwnerId,
                  TotalProductCount = i.Purchases.Sum(pro => pro.Products
                                                      .Where(p => p.ProductLineId == (int)ProductLines.InkCartridges || 
                                                        p.ProductLineId == (int)ProductLines.TonerCartridges)
                                                      .Take(1)
                                                      .Sum(p => p.ItemCount * pro.Quantity))
                };

由于我不知道三个对象(Invoice,PurchaseInfo和Product)的类,我猜测它们是什么:

发票类:我假设它有一个PurchaseInfos的列表/集合

public class Invoice
{
  public int Id { get; set; }
  public int OwnerId { get; set; }

  public List<PurchaseInfo> Purchases { get; set; }
}

PurchaseInfos:发票有多个PurchaseInfos,每个都链接到(理想情况下)一个产品,但由于SKU不是唯一的,我认为它有一个列表/产品集合。

public class PurchaseInfo
{
  public int Id { get; set; }
  public int Quantity { get; set; }

  public int InvoiceId { get; set; }
  public Invoice Invoice { get; set; }

  public int Item {get;set;}
  public List<Product> Products { get; set; }
}

产品类别:我觉得某处有Id字段(未显示)或复合主键

public class Product
{
  public int Sku { get; set; }
  public int ProductLineId { get; set; }
  public int ItemCount { get; set; }

  public List<PurchaseInfo> PurchaseInfos { get; set; }
}

希望你能得到你需要的东西。如果有这种情况,请使用类定义更新问题(如果需要,可以删除不需要的特性),这样可以产生更好的答案。