LINQ к особенностям SQL

После проверки возможного дублирования, предложенного Рокки. Я нашел решение для своего конкретного случая, и я также думаю, что это самое чистое решение на данный момент. Слава @ Эмилиус Мфуруки.

Было несколько других рекомендаций, но добавление flex: 1/n к повторному элементу работало для меня. Таким образом, если у вас есть 2 столбца, это будет 1/2, если 3 будет 1/3 и так далее.

Надеюсь, что это помогает другим.

5
задан VVS 2 October 2008 в 16:05
поделиться

5 ответов

Я сделал бы часть SQL, не делая форматирования, затем сделал бы форматирование на стороне клиента:

var items = list.MyItems.Select(item => new { item.ID, item.Sector, item.Description, 
                                              item.CompleteDate, item.DueDate })
                        .AsEnumerable() // Don't do the next bit in the DB
                        .Select(item => new { item.ID, item.Sector, item.Description,
                                              CompleteDate = FormatDate(CompleteDate),
                                              DueDate = FormatDate(DueDate) });


static string FormatDate(DateTime? date)
{
    return date.HasValue ? date.Value.ToShortDateString() : ""
}
14
ответ дан 18 December 2019 в 05:40
поделиться

В первом запросе Вы уже вернули данные из базы данных к этому времени вторые выполнения строки (объекты var =...). Это означает, что 2-я строка работает в клиенте, куда ToShortDateString может работать вполне счастливо.

Во втором запросе, потому что выбор работает непосредственно на наборе IQueryable (dataContext. MyLists), это пытается перевести выбор в SQL для обработки в сервере, где ToShortDateString не понят - следовательно, "Не Мог Перевести.." исключение.

Для понимания этого немного лучше действительно необходимо понять различие между IQueryable и IEnumerable, и в которой точке Linq К запросу SQL прекращает быть IQueryable и становится IEnumerable. Существует много материала в сети об этом.

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

Paul

8
ответ дан 18 December 2019 в 05:40
поделиться

Точно так же, как сообщение об ошибке говорит Вам, различие происходит из-за того, что может быть сделано локально стихи удаленно при соединении с SQL.

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

После того как Вы вытянули его в локальный объект (в первом примере), это не использует Linq для SQL больше, просто Linq. В той точке Вы свободны сделать локальные манипуляции на нем.

6
ответ дан 18 December 2019 в 05:40
поделиться

Возможно, была ошибка копии и вставки или просто опечатка в Вашем образце. Но в противном случае это могло бы быть проблемой...

Во втором запросе Вы запрашиваете набор списков, тогда как в первом запросе Вы запрашивали объекты в рамках списка. Но Вы не скорректировали запрос для составления этого различия.

То, в чем Вы нуждаетесь, могло бы быть этим. Отметьте прокомментированные строки, которые не появились в Вашем втором образце.

    var items = from aList in dataContext.MyLists
                from i in aList.MyItems  // Access the items in a list
                where aList.ID == myId  // Use only the single desired list
                select
                    new
                        {
                            i.ID,
                            i.Sector,
                            i.Description,
                            CompleteDate = i.CompleteDate.HasValue ? i.CompleteDate.Value.ToShortDateString() : "",
                            DueDate = i.DueDate.HasValue ? i.DueDate.Value.ToShortDateString() : ""
                        };
2
ответ дан 18 December 2019 в 05:40
поделиться

ToShortDateString () не поддерживается Linq to SQL http://msdn.microsoft.com/en-us/library/ bb882657.aspx

1
ответ дан 18 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

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