Есть ли способ объединить эту строчку в одну?

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))
1
Pooriya Arazesh 4 Янв 2016 в 10:27

4 ответа

Лучший ответ

LINQ позволяет иметь несколько условий Where. Таким образом, самый простой способ - использовать отдельные условия Where для каждого List.

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
Результат будет:

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);
2
Domysee 4 Янв 2016 в 07:41

Возникает проблема, когда есть String List и int List вместе

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))
0
Pooriya Arazesh 5 Янв 2016 в 06:35

Вы могли сделать это:

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

1
Channs 5 Янв 2016 в 07:26
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);
1
Steve Harris 4 Янв 2016 в 07:36