LINQ: Создать предложение where во время выполнения, чтобы включить OR (||)? - PullRequest
3 голосов
/ 20 февраля 2011

Мне нужно создать предложение where во время выполнения, но мне нужно сделать OR с предложением where.Возможно ли это ... Позвольте мне объяснить ..

здесь мой код ..., в основном, "фильтр" - это enum Бит, сын, следовательно, фильтр может быть больше чем 1 из следующих значений .. Следовательно, мне нужносоздать предложение where ...

Если я выполняю wheres отдельно, представьте, что сначала я делаю Untested, и он возвращает 0 записей, что означает, что я не могу выполнить where в Tested, потому что его сейчас0 записей.

Я приведу ниже код псевдо :-)

        string myWhere = "";

        if ((filter & Filters.Tested) == Filters.Tested)
        {
             if (myWhere != "" ) myWhere =myWhere + "||";
             myWhere = myWhere " Status == "Tested";

        }

        if ((filter & Filters.Untested) == Filters.Untested)
        {
             if (myWhere != "" ) myWhere =myWhere + "||";
             myWhere = myWhere " Status == "Untested";
        }

        if ((filter & Filters.Failed) == Filters.Failed)
        {
             if (myWhere != "" ) myWhere =myWhere + "||";
             myWhere = myWhere " Status == "Failed";
        }

        // dataApplications = a List of items that include Tested,Failed and Untested.

        // dataApplciation.Where ( myWhere) ---  Confused here!  

Возможно ли это ...

Я не хочу включать много "IF"«потому что существует множество сочетаний, т.е. нет фильтра, фильтр = только тестирование, фильтр = не проверено и протестировано ... и многое другое

Любая идея действительно ценится

Спасибо

Ответы [ 3 ]

4 голосов
/ 20 февраля 2011

Если у вас есть это:

IEnumerable<MyType> res = from p in myquery select p;

Вы можете определить

var conditions = new List<Func<MyType, bool>>();

conditions.Add(p => p.PropertyOne == 1);
conditions.Add(p => p.PropertyTwo == 2);

res = res.Where(p => conditions.Any(q => q(p)));

А теперь хитрость состоит в том, чтобы составлять списки функций анонимных объектов (и вы можете легко изменить его на«извлекать» тип анонимных объектов)

static List<Func<T, bool>> MakeList<T>(IEnumerable<T> elements)
{
    return new List<Func<T, bool>>();
}

Вы вызываете его, передавая результат запроса LINQ.Итак

var res = from p in elements select new { Id = p.Id, Val = p.Value };
var conditions = MakeList(res);
3 голосов
/ 20 февраля 2011
var statusTexts = new List<string>(); // Add desired status texts
dataApplication.Where(item =>
        statusTexts.Any(status => item.Status == status))
0 голосов
/ 25 июня 2015

Используйте HashSet <> для статусов, тогда .Contains будет O (1) вместо обычного O (n) для Списка <>:

var statuses = new HashSet<string>() {"a", "b", "c"};
var list = new[] {
    new {   Id = 1, status = "a"},
    new {   Id = 2, status = "b"},
    new {   Id = 3, status = "z"}
};

var filtered = list.Where(l => statuses.Contains(s => l.status == s));
...