LINQ несколько, где пункт

Попробуйте:

value = float(dataset[i]) - float(dataset[i - 1])

Вместо:

value = dataset[i] - dataset[i - 1]
11
задан Amir 28 February 2009 в 11:14
поделиться

2 ответа

Так как Вы работаете w/LINQ, я предполагаю, что Вы работаете против права контекста данных LINQ-SQL? У меня нет запасного DataContext, лежащего вокруг для тестирования этого, но это должно дать Вам некоторое представление.

Я не знаю, будет ли это работать против контекста данных, хотя, но большинство из них довольно основной материал (объединяющий операцию ИЛИ в цепочку, и Содержит вызов метода), таким образом, это не должно вызывать проблему, когда запрос переводит в SQL.

Сначала я создаю пользовательскую функцию, которая создала бы мой предикат:

Func<string, Func<DataItem, bool>> buildKeywordPredicate =
    keyword =>
        x => x.Title.Contains(keyword)
            || x.Contents.Contains(keyword);

Это - функция, которая берет единственное строковое ключевое слово, и затем возвратите другую функцию, которая берет DataItem и проверяет его по ключевому слову.

В основном, если Вы передадите в "Стеке", то Вы получите предикат: x => x.Title.Contains("Stack") || x.Contents.Contains("Stack").

Затем, с тех пор существует много возможных ключевых слов, и необходимо объединить его в цепочку с ИЛИ операция, я создаю другую функцию помощника для объединения в цепочку 2 предикатов вместе с ИЛИ

Func<Func<DataItem,bool>, Func<DataItem, bool>, Func<DataItem, bool>> buildOrPredicate =
    (pred1, pred2) =>
        x => pred1(x) || pred2(x);

Эта функция берет 2 предиката, и затем соедините их с ИЛИ операция.

Имея те 2 функции, я могу затем создать мой где предикат как это:

foreach (var word in keywords) {            
    filter = filter == null
        ? buildKeywordPredicate(word)
        : buildOrPredicate(filter, buildKeywordPredicate(word));
}

Первая строка в цикле в основном проверяет, является ли фильтр пустым. Если это, то мы хотим простой фильтр ключевого слова, созданный для нас.

Еще, если фильтр не является пустым, мы должны объединить существующие фильтры в цепочку с ИЛИ операция, таким образом, мы передаем существующий фильтр и новый фильтр ключевого слова к buildOrPredicate, чтобы сделать просто это.

И затем мы можем теперь создать ГДЕ часть запроса:

var result = data.Where(filter);

При передаче в сложном предикате мы только что создали.

Я не знаю, будет ли это отличающийся от использования PredicateBuilder, но так как мы задерживаем перевод запроса в механизм LINQ-SQL, не должно быть никаких проблем.

Но поскольку я сказал, я, havn't протестировал его против реального контекста данных, поэтому если существуют какие-либо проблемы, которые можно записать в комментариях.

Вот консольное приложение, которое я создал для тестирования: http://pastebin.com/feb8cc1e

Надеюсь, это поможет!


Править: Для более универсальной и допускающей повторное использование версии, которая вовлекает правильно использование Деревьев выражений в LINQ, сообщение в блоге Thomas Petricek выезда: http://tomasp.net/articles/dynamic-linq-queries.aspx

13
ответ дан 3 December 2019 в 08:57
поделиться

Поскольку разработчик предиката не знает, что тип БД свойства Содержит метод, обращен, я предполагаю, что это могло бы быть проблемой внутри linq к sql. Вы попробовали нормальным запросом (не с разработчиком предиката), и Столбец текста с Содержит?

0
ответ дан 3 December 2019 в 08:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: