在Where(entityFramework)中组合if
本文关键字:组合 if entityFramework Where | 更新日期: 2023-09-27 18:28:47
有没有办法将这一行合并为一行?
if(List1.count>0 && List2.count>0 && List3.count>0)
{
ctx.table.where(o=>List1.contains(o.item1) && List2.contains(o.item2) && List3.contains(o.item3))
}
else if(List1.count>0 && List2.count>0 && List3.count==0)
{
ctx.table.where(o=>List1.contains(o.item1) && List2.contains(o.item2))
}
else if(List1.count>0 && List2.count==0 && List3.count>0)
{
ctx.table.where(o=>List1.contains(o.item1) && List3.contains(o.item3))
}
...
像这样的
ctx.table.where(o=>if(List1.count>0) List1.contains(o.item1) && if(List2.count>0) List2.contains(o.item2) && if(List3.count>0) List3.contains(o.item3))
Where
条件。因此,最简单的方法是对每个List
使用单独的Where
条件。
IEnumerable<int> collection = ctx.table;
if(list1.Count > 0)
{
collection = collection.Where(o => list1.Contains(o.item1));
}
if(list2.Count > 0)
{
collection = collection.Where(o => list2.Contains(o.item2));
}
if(list3.Count > 0)
{
collection = collection.Where(o => list3.Contains(o.item3));
}
如果您真的只想有一行,可以使用listX.Count > 0 ? listX.Contains(o.itemX) : true
将这些条件组合为1结果是:
IEnumerable<int> collection = ctx.table.Where(o =>
list1.Count > 0 ? list1.Contains(o.item1) : true &&
list2.Count > 0 ? list2.Contains(o.item2) : true &&
list3.Count > 0 ? list3.Contains(o.item3) : true);
ctx.table.where(o=> List1.count>0 ? List1.contains(o.item1) : true && List2.count>0 ? List2.contains(o.item2) : true && List3.count>0 ? List3.contains(o.item3) : true);
您可以这样做:
var found = ctx.table.Where(o => (!List1.Any() || List1.Contains(o.item1))
&& (!List2.Any() || List2.Contains(o.item2))
&& (!List3.Any() || List3.Contains(o.item3)));
注意,ListX.Any()
本质上是短路的,因此比ListX.Count > 0
性能更好
当字符串列表和int列表同时存在时会出现问题
Where(o=>(Stringlist1.Count > 0) ? Stringlist1.Contains(o.string1) : true &&
(Intlist1.Count > 0 ?) Intlist1.Contains(o.Int1) : true)
但如果将它们一分为二,效果良好
Where(o=>(Stringlist1.Count > 0) ? Stringlist1.Contains(o.string1) : true ).Where(o=>
(Intlist1.Count > 0 ?) Intlist1.Contains(o.Int1) : true)
你知道吗?
///////////////////////////////////////
我找到了解决方案,所有部分都必须在括号中
Where(o=>((Stringlist1.Count > 0) ? Stringlist1.Contains(o.string1) : true ) &&
((Intlist1.Count > 0 ?) Intlist1.Contains(o.Int1) : true))