【发布时间】:2017-06-05 15:42:01
【问题描述】:
首先,我想原谅自己向其他现有问题发布了类似的问题,但我是 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 表达式,但我找不到我的案例的示例。
提前谢谢你。
【问题讨论】:
标签: c# sql-server linq lambda