Как я могу объединить предложение where, используя OR на LINQ? - PullRequest
2 голосов
/ 28 июля 2011

У меня есть этот код:

foreach (Package pack in Packages)
{
    filteredResults = filteredResults.Where(o => o.ID == pack.ID);
}

Единственная проблема в том, что я фильтрую результат N раз (так N где). Что я хотел бы сделать, это отфильтровать результат только один раз (только предложение where) с N выражением. Что-то вроде:

    Where o.ID == pack.ID OR o.ID == pack.ID OR o.ID == pack.ID OR o.ID == pack.ID...

Возможно ли это сделать с помощью LINQ?

Ответы [ 5 ]

3 голосов
/ 28 июля 2011
var packIds = Packages.Select(x=>x.ID).ToArray();
filteredResults = filteredResults.Where(o=> packIds.Contains(o.ID));

Если это linq to sql, это будет переведено в:

WHERE ID IN (1,2,3,4)
3 голосов
/ 28 июля 2011

Что-то вроде приведенного ниже кода должно работать или, по крайней мере, направить вас в правильном направлении.

-- Get all the package IDs you want to select on.
var packIDs = from pack in Packages
    select pack.ID;

-- Return all results where the ID is in the package ids above.
filteredResults = from result in filteredResults
    where packIDs.Contains(result.ID)
    select result;

Вышесказанное предполагает, что вы и были логической ошибкой, а вы имели в виду или.

2 голосов
/ 28 июля 2011

Как-то так может вам помочь:

filteredResults = originalResults.Where(o => Packages.Any(p => p.ID == o.ID));
1 голос
/ 21 января 2016

Я думаю, вам нужно использовать выражение с LinqKit

var v = from utente in db.Utente
        select utente;

Expression<Func<Utente, bool>> expr = c => c.Age == 26;
expr = expr.Or<Utente>(c => c.Name != "Matteo");

v = v.Where(expr.Expand());

Результат:

SELECT...... FROM......
WHERE (26 = [Extent1].[Age ]) OR ('Matteo' <> [Extent1].[Name])

У меня та же проблема, я пробую это решение

1 голос
/ 28 июля 2011

Вы не хотите Intersect ()? * 1001 то есть *

var ids = filteredResults.Select( fr => fr.Id ).Intersect(Packages.Select( p => p.PackID ) )  ;
...