如何基于列将5种不同类型的linq查询合并为一种

时间:2011-10-12 13:36:13

标签: c# linq nhibernate sqlite linq-to-sql

我对我需要的报告感到很困惑。截至今天,我的大多数报告都很简单,所以我能够轻松地完成这些工作。但作为sql / dlinq的新手,我无法通过以下方式找到答案:

var closingStock =
    (from p in session.Query<Product>()
    select new
    {
        p.Id,
        p.Name,
        p.Batch,
        p.Rate,
        ClosingStock = p.Quantity - p.AllocatedQuantity,
        p.DivisionId
    }).ToList();

var distributedQuantityAfterPeriod =
    (from i in session.Query<OutwardInvoiceItem>()
    where i.ParentInvoice.Date > ToDate 
    select new
    {
        Id = i.Product.Id,
        DistributedAfter = i.Quantity
    }).ToList();

var distributedQuantityInPeriod =
    (from i in session.Query<OutwardInvoiceItem>()
    where i.ParentInvoice.Date >= FromDate && i.ParentInvoice.Date <= ToDate
    select new
    {
        Id = i.Product.Id,
        Distributed = i.Quantity
    }).ToList();

var receivedQuantityAfterPeriod =
    (from i in session.Query<InwardInvoiceItem>()
    where i.ParentInvoice.Date > ToDate
    select new
    {
        Id = i.Product.Id,
        ReceivedAfter = i.Quantity
    }).ToList();

var receivedQuantityInPeriod =
    (from i in session.Query<InwardInvoiceItem>()
    where i.ParentInvoice.Date >= FromDate && i.ParentInvoice.Date <= ToDate
    select new
    {
        Id = i.Product.Id,
        Received = i.Quantity
    }).ToList();

如您所见,我正在尝试为特定日期制作库存移动报告。我有以下问题:
1.如何减少五个查询?有可能吗?
2.如何将这些查询提供的数据合并到一个表中,该表按产品ID分组并在数量相关列上求和?截至目前,我正在使用非常慢的循环。

我在用什么:
C#4,nHibernate,Sqlite

任何帮助都将受到高度赞赏。

此致 约杰什。

1 个答案:

答案 0 :(得分:1)

  1. 使用.Future()代替.List()

  2. 减少往返次数
  3. 让所有查询返回

    group i by i.Id into g
    select new
    {
        Id = g.Key,
        Quantity = g.Sum(x => x.Quantity)
    }).Future();
    
  4. 并做

    var alltogether = groupedDistributedQuantityAfterPeriod
        .Concat(groupedDistributedQuantityInPeriod)
        .Concate(...);
    
    from g in alltogether
    group g by g.key into all
    select new
    {
        Id = all.Key,
        Quantity = all.Sum(x => x.Quantity)
    };
    

    更新

    您可以使用

    减少查询次数
    from i in session.Query<OutwardInvoiceItem>()
    where (i.ParentInvoice.Date > ToDate) || (i.ParentInvoice.Date >= FromDate && i.ParentInvoice.Date <= ToDate)
    select ...
    
    from i in session.Query<InwardInvoiceItem>()
    where (i.ParentInvoice.Date > ToDate) || (i.ParentInvoice.Date >= FromDate && i.ParentInvoice.Date <= ToDate)
    select ...