2009-10-10 6 views
0

Вам нужна ваша помощь.LINQ to SQL lambda exp. OrderBy, Case Когда

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

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() 
); 

ответ

1

Если вы можете жить с возвратом объекта POCO вы можете do:

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 не будет самым красивым, хотя.

0

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

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

1

почему не могу просто сделать

возврата db.Topics .где (т => t.ForumID == ID) .OrderBy (t.Replies.Min (г => (DateTime?) Г. AddDateTime) ?? t.AddDateTime) .Select (г => r.AddDatetime) .Первых()

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

 Смежные вопросы

  • Нет связанных вопросов^_^