更容易(更好)编写LINQ查询的方法



我有两个 LINQ查询,我使用第1个 LINQ查询的结果,然后使用foreach循环遍历每个元素,并在第二个LINQ查询

中使用它
var entries = dbo.OnDemand.Where(c => c.LOTNO == LotNo).Where(c => c.ODHisDate >= start && c.ODHisDate <= end).Where(c => c.Activity.Contains(reprinted)).OrderBy(c => c.ODHisDate);
foreach (var X in entries)
{  
    Barcodes.Add(X.Barcode);    // Barcodes is a List<string>
}
foreach (string barcode in Barcodes)
{
    var entries2 = dbo.OnDemand.Where(c => c.Barcode.Contains(barcode)).Where(c => c.ODHisDate >= start && c.ODHisDate <= end).OrderBy(c => c.ODHisDate);
    // Do stuff with entries2
}

有没有一种方法可以使用单个查询执行此操作?

我四处阅读,人们使用JOIN,但我不确定如何使用它。

两个查询(选定的日期范围和日期ORDERBY)的某些表达式很常见

目前以这种方式有效,但我认为有一种更好的方法可以做我要实现的目标。

任何帮助将不胜感激。

编辑1:

样本SQL查询:

select * FROM [dbo].[OnDemand]
where barcode in
(
SELECT [Barcode]      
  FROM [dbo].[OnDemand]
  group by barcode
  having count(*) > 1
  )  
 and odhisdate between  '2017-01-11' and '2017-01-31' 
 and Activity like '%reprinted%'
  order by ODHisDate asc, ODHisTime asc

据我所知,不需要JOIN,因为您正在查询同一张表,并且您没有尝试进行递归或交叉加入查询。

为什么要使用相同的参数查询同一表?您可以将List的条目返回,然后通过Barcode值迭代,然后返回并用相同的Barcode值查询同一表。

如果您想在线迭代,语法是直截了当的,但是我不确定您是否了解您在那里做什么。

dbo.OnDemand.Where(c => c.Barcode.Contains(barcode))
    .Where(c => c.ODHisDate >= start && c.ODHisDate <= end)
    .OrderBy(c => c.ODHisDate)
    .ForEach(c =>
        {
            // do stuff
        }

我想您这样做是因为有相同的条形码元素。解决方案可能是:

var entries = dbo.OnDemand.Where(c => c.LOTNO == LotNo 
                                   && c.ODHisDate >= start && c.ODHisDate <= end 
                                   && c.Activity.Contains(reprinted))
                          .Select(c => c.Barcode);//Don't need to orderby here
// You will get a IEnumerable<List<OnDemand>> as result of this query
var entries2 =entries.Select(barcode =>  dbo.OnDemand.Where(c => c.Barcode.Contains(barcode) 
                                                              && c.ODHisDate >= start && c.ODHisDate <= end)
                                                     .OrderBy(c => c.ODHisDate)
                                                     .ToList());
foreach (var list in entries2)
{
 // do stuff
}

更好的想法可以首先通过常见条件过滤,后来由条形码组成,然后保留具有符合第二个条件的元素的组

var entries = dbo.OnDemand.Where(c.ODHisDate >= start && c.ODHisDate <= end)
                          .GroupBy(c=>c.BarCode)
                          .Where(g=>g.Any(c=>c.LOTNO == LotNo && c.Activity.Contains(reprinted) ))
                          .Select(g=>g.OrderBy(c => c.ODHisDate).ToList()); 

更新

var entries = dbo.OnDemand.Where(c.ODHisDate >= start && c.ODHisDate <= end && c.Activity.Contains(reprinted))
                          .GroupBy(c=>c.BarCode)
                          .Where(g=>g.Count()>1)
                          .Select(g=>g.OrderBy(c => c.ODHisDate));

最新更新