Почему это предложение LINQ Where не возвращает результаты? - PullRequest
1 голос
/ 03 сентября 2010

У нас есть объект со свойством DateTime DateDestroyed.Запрос должен возвращать результаты, где это значение находится между нулями DateTimes startDate и endDate.

У меня есть предложения where:

.Where(x => startDate.HasValue ? startDate <= x.DateDestroyed : true)
.Where(x => endDate.HasValue ? x.DateDestroyed <= endDate : true);

Запрос всегда не возвращает результатов.Я уверен, что не написал этот запрос должным образом, но не знаю, как он должен быть написан или почему он не работает?

Ответы [ 4 ]

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

Мой код требует IQueryable, поэтому я адаптировал работу @p.campbell на ExtensionMethod.net следующим образом:

public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Func<TSource, bool> predicate)
{
    return condition ? source.Where(predicate).AsQueryable() : source;
}

public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Func<TSource, int, bool> predicate)
{
    return condition ? source.Where(predicate).AsQueryable() : source;
}
0 голосов
/ 03 сентября 2010

Вы можете создать / использовать метод расширения для WhereIf:

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

 var foo = db.Customers.WhereIf(startDate.HasValue, 
                                   x => startDate <= x.DateDestroyed)
                       .WhereIf(endDate.HasValue,  
                                   x => x.DateDestroyed <= endDate );

Подробнее на Гдена ExtensionMethod.net .Вы можете найти код там для IEnumerable<T> и IQueryable<T>.

0 голосов
/ 03 сентября 2010

Вы всегда переназначаете свой запрос с применением фильтра Where()?

Этот шаблон должен работать как ожидалось:

var query = getResults();
query = query.Where(x => startDate.HasValue ? startDate <= x.DateDestroyed : true)
query = query.Where(x => endDate.HasValue ? x.DateDestroyed <= endDate : true);
0 голосов
/ 03 сентября 2010

допустим, у вас есть переменная под названием «запрос», в которой вы сохранили начальную часть вашего оператора linq. Попробуйте это для динамического построения предложения where:

if (startDate.HasValue) {
    query = query.Where(x => x.DateDestroyed >= startDate);
}
if (endDate.HasValue) {
    query = query.Where(x => x.DateDestroyed <= endDate);
}

LINQ работает с отложенным выполнением, поэтому предложение WHERE будет корректно разрешаться при выполнении кода.

...