为什么LastOrDefault与IEnumerable <viewmodel>

时间:2016-04-04 08:26:54

标签: c# asp.net-mvc entity-framework

我正在尝试合并多个查询结果,并且使用IEnumerable<Viewmodel>作为每个查询的类型,我使用concat进行组合,但我无法对每个查询使用LastOrDefault() - {{ 3}}

但我需要指定查询只返回Last值,如果为null则返回none,但是有错误。

我已经尝试First()FirstOrDefault()SingleOrDefault(),但仍然给了我一个错误。

编辑: 这三个查询在返回的列上具有相同的结构

IEnumerable<ViewModel> query1= db.Table1
                        .Where(er => er.ID == Filter1) 
                        .Select(er => new ViewModel
                         {
                           //columns here 
                         }).ToList().LastOrDefault(); //the **ToList().LastOrDefault();** shows error but I need this to get only the last row from the query if there is

IEnumerable<ViewModel> query2= db.Table2
                        .Where(er => er.ID == Filter2) 
                        .Select(er => new ViewModel
                         {
                           //columns here 
                         }).ToList().LastOrDefault(); //the **ToList().LastOrDefault();** shows error but I need this to get only the last row from the query if there is

IEnumerable<ViewModel> query3= db.Table3
                        .Where(er => er.ID == Filter3) 
                        .Select(er => new ViewModel
                         {
                           //columns here 
                         }).ToList().LastOrDefault(); //the **ToList().LastOrDefault();** shows error but I need this to get only the last row from the query if there is

var result = query1.Concat(query2).Concat(query3).ToList();//it shows error here if I add the **ToList().LastOrDefault()** per query

如果我在结果语句中添加 LastOrDefault(),它将只显示一行来自 query3

我该如何解决这个问题?非常感谢你,请耐心等待我。

3 个答案:

答案 0 :(得分:1)

好吧,我会说最好的方法是覆盖List<T>,但是如果你的项目很小,这是你需要它的唯一地方你就可以这样做:

List<ViewModel> list1 = new List<ViewModel>();

var query1 = db.Table1.Where(er => er.ID == Filter1)
                      .Select(er => new ViewModel
                        {
                            //columns here 
                        }).ToList().LastOrDefault(); 
list1.Add(query);

var query2 = db.Table2.Where(er => er.ID == Filter2)
                      .Select(er => new ViewModel
                        {
                            //columns here 
                        }).ToList().LastOrDefault(); 
list1.Add(query);

var query3 = db.Table3.Where(er => er.ID == Filter3)
                      .Select(er => new ViewModel
                        {
                            //columns here 
                        }).ToList().LastOrDefault();

list1.Add(query);

return list1;

答案 1 :(得分:1)

无需连续填写或转发声明列表并添加元素等等。您可以逐个选择项目并将其具体化为列表,如下所示:

var a = table
    .Where(PredicateA)
    .Select(Selector)
    .FirstOrDefault();
var b = table
    .Where(PredicateB)
    .Select(Selector)
    .FirstOrDefault();
var c = table
    .Where(PredicateC)
    .Select(Selector)
    .FirstOrDefault();
var result = new[] {a, b, c};

或者您可以在一个查询中一起选择它们(可能性能更好,但有利于您认为更具可读性)。

var result = table
    .Where(x => PredicateA(x) || PredicateB(x) || PredicateC(x))
    .Select(Selector);

答案 2 :(得分:0)

LastOrDefault不会为您提供IEnumerable但只提供一个元素。并尝试将其分配给IEnumerable。那是你的问题。在你的情况下,我会重写LastOrDefault(或使用另一个函数而不是它),所以它只返回一个只需要一个元素的IEnumerable