Значение даты Linq-to-entity в базе данных является строкой - PullRequest
1 голос
/ 30 ноября 2011

Лично я знаю достаточно Linq, чтобы быть опасным.

  • Задача под рукой;Мне нужно запросить DAL и вернуть список объектов на основе диапазона дат.Звучит достаточно просто, однако дата является строкой, и по какой-то причине она должна оставаться строкой.

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

Вот дурацкий способ итерации ... каждая дата привязывает базу данных, что я ненавижу делать.
- Это работает

DateTime start = Convert.ToDateTime(RecipientSearch.TransplantSearchStartDate);
DateTime end = Convert.ToDateTime(RecipientSearch.TransplantSearchEndDate);
var tempselectQuery = selectQuery;

while (start <= end)
{
    tempselectQuery = selectQuery;
    string sStart = Convert.ToDateTime(start).ToString(ResourceFormatting.DateOnly);

    tempselectQuery = (ObjectQuery<DAL.Recipients>)tempselectQuery.Where(item => item.TransplantDate == sStart);
    if (tempselectQuery.Count() != 0) TXPlistQueryDAL.AddRange(tempselectQuery.ToList());
    start = start.AddDays(1);
}

Вот моя попытка заставить мой запрос работать в одном вызове БД
- Это не работает ... пока

DateTime start = Convert.ToDateTime(RecipientSearch.TransplantSearchStartDate);
DateTime end = Convert.ToDateTime(RecipientSearch.TransplantSearchEndDate);
List<string> sdates = new List<string>();

// Put my date strings in a list so I can then do a contains in my LINQ statement
// Date format is "11/29/2011"
while (start <= end)
{   
    string sStart = Convert.ToDateTime(start).ToString(ResourceFormatting.DateOnly);
    sdates.Add(sStart);
    start = start.AddDays(1);
}

// Below is where I get hung up, to do a .contains i need to pass in string, however x.TransplantDate
// includes time, so i am converting the string to a date, then using the EntityFunction to Truncate
// the time off, then i'd like to end up with a string, hence the .ToString, but, linq to entities
// thinks this is part of the sql query and bombs out... This is where I'm stumped on what to do next.

selectQuery =
    (ObjectQuery<DAL.Recipients>)
    from x in entities.Recipients 
    where sdates.Contains(EntityFunctions.TruncateTime(Convert.ToDateTime(x.TransplantDate)).ToString()) 
    select x;

Ошибка, которую я получаю следующим образом:
enter image description here

Я понимаю, почему я получаю ошибку, но я не знаю правильный код LINQ, чтобы иметь возможность получить то, что я пытаюсьделать.Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 01 декабря 2011

Тьфу, я чувствую себя тупым.Я попробовал несколько хитрых мелочей, чтобы получить x.TransplantDate только строку с датой в моем запросе Linq, EG 10/15/2011

where sdates.Contains(EntityFunctions.TruncateTime(Convert.ToDateTime(x.TransplantDate)).ToString())

Оказывается, она уже в правильном формате вбазы данных, и если я упростить ее до

where sdates.Contains(x.TransplantDate)

Это работает.Причина, по которой я не получил никаких возвращенных записей, заключалась в том, что я тестировал диапазоны дат, у которых не было никаких данных для этих конкретных дат ... UGHH.

Итак, в итоге все получилось нормально.И если кто-то делает что-то подобное, может быть, вы можете извлечь уроки из этого примера.

DateTime start = Convert.ToDateTime(RecipientSearch.TransplantSearchStartDate);
DateTime end = Convert.ToDateTime(RecipientSearch.TransplantSearchEndDate);
List<string> sdates = new List<string>();

while (start <= end)
{
    string sStart = Convert.ToDateTime(start).ToString(ResourceFormatting.DateOnly);
    sdates.Add(sStart);
    start = start.AddDays(1);
}

selectQuery =
    (ObjectQuery<DAL.Recipients>)
    from x in entities.Recipients
    where sdates.Contains(x.TransplantDate)
    select x;
...