Составление предложения where в запросе LINQ во время выполнения - PullRequest
5 голосов
/ 11 сентября 2010

Я получаю массив строк, для которых я хочу посмотреть, есть ли все эти строки в определенном количестве полей данных в доменном объекте. Я знаю поля данных во время компиляции, но я не знаю размер массива во время компиляции.

Есть ли способ, которым я могу составить предложение where во время выполнения, чтобы я мог делать то, что я ищу, в одном запросе linq.

Если вам интересно, почему это один запрос: я хочу максимально сократить количество обращений к БД.

public IEnumerable<domainObjects> GetObjectsWith(string[] data)
{
    var results = from d in domainObjects
                  where 
                  (d.Data.Contains(data[0]) && d.Data.Contains(data[1]) && ...)
                  ||
                  (d.Data2.Contains(data[0]) && d.Data.Contains(data[1]) && ...)
                  .
                  .
                  . // Data fields known at compile-time
}

Конечный результат, учитывая 2 объекта:

domainObject  { Address = "1st st", Description="has couch and bed" }
domainObject2 { Address = "1st rd", Description="has couch" }

Запрос для { "couch", "bed" } вернет только domainobject 1, но запрос для { "couch" } вернет оба.

Likeqise запрос для { "1st", "couch", "bed" } также будет возвращать оба.

Ответы [ 3 ]

2 голосов
/ 11 сентября 2010

Вы должны использовать PredicateBuilder, это бесплатный служебный класс, который позволяет вам создавать сложные выражения, где с использованием And и Or во время выполнения.Вы можете перебрать свой массив и построить предложение where таким образом.

http://www.albahari.com/nutshell/predicatebuilder.aspx

2 голосов
/ 11 сентября 2010

Есть 3 основных способа сделать это: PredicateBuilder, библиотека Dynamic Linq или манипулирование своими собственными деревьями выражений (что первые два помогают вам сделать под покровом).

PredicateBuilder - ваш лучший выбор, если вы знаетевсе свойства заранее.Если они являются динамическими (то есть пользователь выбирает их, то лучшим выбором будет Dynamic Linq).

См. Также Существует ли шаблон, использующий Linq для динамического создания фильтра? .

текст ссылки

1 голос
/ 11 сентября 2010
...