我有两个 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));