我正在尝试合并多个查询结果,并且使用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
我该如何解决这个问题?非常感谢你,请耐心等待我。
答案 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
。