首先,我想原谅自己向其他现有问题发布类似的问题,但我是C#的新手,只是开始掌握LINQ。 我在两个表中有一些业务逻辑,它们获得一行的字段。如果不存在这样的行,则它应该默认为空字符串。 在LINQ之外,这很容易:
var res = SomeClass.foo?.bar ?? "";
但是在LINQ中,不支持运算符?.
和??
,所以我采用了这个:
var projectTask = repository.Set<tblProject>().Where(p => includeInactive ||
(p.tblOrderStatus.OrderByDescending(s => s.Date).FirstOrDefault().StatusID != StatusIds.Deducted &&
p.tblOrderStatus.OrderByDescending(s => s.Date).FirstOrDefault().StatusID != StatusIds.Deduc_RestDecays &&
p.tblOrderStatus.OrderByDescending(s => s.Date).FirstOrDefault().StatusID != StatusIds.Cancelled))
.Select(p => new {
p.ID,
p.CustomerID,
p.CenterID,
p.FrameworkID,
p.DeductionmodeID,
p.Code,
p.Descriptioln,
p.StartDate,
p.EndDate,
Referencetext = p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1).OrderByDescending(m => m.Date).FirstOrDefault() != null ?
p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1).OrderByDescending(m => m.Date).FirstOrDefault().Referencetext : ""
})
.ToListAsync();
我在那里进行两次查询,在这种情况下不是性能查杀,但仍然不是很优雅。
我知道您可以通过Expression
构建LINQ表达式,但我无法找到我的案例。
提前谢谢。
答案 0 :(得分:2)
但在LINQ中,不支持运算符
?.
和??
我想在LINQ这里你的意思是LINQ对IQueryable
(内部表达式树),因为在LINQ中对IEnumerable
(有委托)都支持。
虽然你在表达式树中尚未支持?.
运算符,但完全支持??
。
所以,如果问题出在这个表达式上:
Referencetext =
p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1)
.OrderByDescending(m => m.Date).FirstOrDefault() != null ?
p.tblOrderHistories.Where(m => m.OrderReferencetypeID == 1)
.OrderByDescending(m => m.Date).FirstOrDefault().Referencetext : ""
可以使用Select
,FirstOrDefault
和??
运算符的组合轻松处理:
Referencetext = p.tblOrderHistories
.Where(m => m.OrderReferencetypeID == 1)
.OrderByDescending(m => m.Date)
.Select(m => m.Referencetext)
.FirstOrDefault() ?? ""