Entity Framework: лучший способ запросить набор дат с помощью Linq - PullRequest
2 голосов
/ 05 сентября 2011

У меня есть набор уникальных DateTimes (без временной части), которые пользователь может выбрать из пользовательского интерфейса. Это не только диапазон, как «LastWeek» или «LastMonth». Пользователь может продавать каждый день, когда захочет. Что может быть лучшим способом для Linq-запроса в EntityFramework для сопоставления результатов? У меня есть таблица Foo с атрибутом CreatedAt, в которой хранится информация с временной частью. Конечно, я не хочу проверять CreatedAt-Property на стороне клиента, SqlServer должен выполнить эту работу за меня.

Я думаю, что-то вроде:

var query = _entities.Foo.Where(x => x.UserID == user.ID);

if (selectedDates.IsNullOrEmpty() == false)
    query = query.Where(x => x.CreatedAt 'IsIn' selectedDates);

or:
foreach (var date in selectedDates)
    query = query.Where(x => x.CreatedAt.Year == date.Year && x.Month == date.Month && x.Day == date.Month) //but of course here I have the problem that I have to use the 'Or'-Operator, not 'And'.

Как мне это сделать?

Ответы [ 3 ]

4 голосов
/ 05 сентября 2011

Вы можете использовать EntityFunctions.TruncateTime () для выполнения усечения даты на сервере. Тогда что-то вроде этого должно работать.

query = query.Where(x => selectedDates.Contains(EntityFunctions.TruncateTime(x));
1 голос
/ 05 сентября 2011

Попробуйте query = query.Where(x => selectedDates.Contains(x.CreatedAt));

1 голос
/ 05 сентября 2011

Вы можете вызвать метод расширения Contains на selectedDates. Entity Framework 4.0 поймет это и переведет его в оператор IN в SQL:

if (selectedDates.IsNullOrEmpty() == false)
    query = query.Where(x => selectedDates.Contains(x.CreatedAt));
...