LINQ to SQL лямбда-эксп. OrderBy, Case When - PullRequest
0 голосов
/ 10 октября 2009

В этом вам понадобится ваша помощь.

Я пытаюсь заказать первый ответ по дате и времени, если он есть. Если оно пустое / пустое, оно должно быть упорядочено по дате и времени. Я получил следующее выражение, но, похоже, оно не работает: (

return db.Topics
.Where(t => t.ForumID == id)
.OrderBy(
    t => t.Replies
    .OrderBy(r => r.AddDatetime.Equals(System.Data.SqlTypes.SqlDateTime.Null.Value) ? t.AddDatetime : r.AddDatetime)
    .Select(r => r.AddDatetime)
    .First()
);

Ответы [ 3 ]

1 голос
/ 12 октября 2009

Если вы можете вернуться к объекту POCO, вы можете сделать:

var pocoenum = db.Topics
.Where(t => t.ForumID == id)
.Select(
new {
    ...
    AddDatetime = t.Replies.Select(r => r.AddDateTime).FirstOrDefault == null ? t.AddDatetime : t.Replies.Max(r => r.AddDateTime)
};

return pocoenum.OrderBy(p => p.AddDatetime)

SQL не будет самым красивым, хотя.

1 голос
/ 11 января 2010

почему ты не можешь просто сделать

return db.Topics .Where (t => t.ForumID == id) .OrderBy (t.Replies.Min (r => (DateTime?) R.AddDateTime) ?? t.AddDateTime) .Select (r => r.AddDatetime) .First ()

если само r.AddDatetime имеет значение null, то вы можете удалить приведение, в противном случае вам нужно это приведение, чтобы функция Min возвращала DateTime? а не DateTime

0 голосов
/ 10 октября 2009

Вам понадобятся два оператора Linq, по одному для каждого OrderBy. Используйте оператор If, чтобы решить, какой оператор Linq возвращать.

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

...