代码:
var primeCtr = con.Contractors?.Where(ctr => ctr.Type == "Prime").FirstOrDefault();
if (primeCtr == null)
primeCtr = con.Contractors?.Where(ctr => ctr.Type == "Original Prime").FirstOrDefault();
解释:如果存在“Prime”类型的承包商,则使用该承包商,否则使用“Original Prime”
我可以使用?:表达式来编写这个代码,但是我认为效率会较低?
var primeCtr = con.Contractors?.Where(ctr => ctr.Type == "Prime").Any() ? con.Contractors?.Where(ctr => ctr.Type == "Prime").FirstOrDefault() : con.Contractors?.Where(ctr => ctr.Type == "Original Prime").FirstOrDefault();
我认为“Prime”的查询会被执行两次?
只是想确定是否有更优雅的方式来使用 EF Core 8 来表达这一点?这是我的第一个 EF Core 应用程序,我已经好几年没用过旧的 EF 了,所以可能会生疏。
最常见的方式是按偏好排序并取第一个:
如果有更多类型,您必须过滤掉“Prime”和“Original Prime”(
Where
在排序前添加)。顺序是降序的,因为真实的
ctr.Type == "Prime"
会浮到顶部。Where
您可以在/内使用三元运算符OrderBy
:这转化为 SQL 中的 CASE:(不要介意表/列的名称,这只是使用以前的表/实体进行的快速测试)
您可以根据需要添加任意数量的值,并完全控制顺序,而无需假设类型值是按升序还是降序排列。
可以说,在 SQL 中没有“好”的方法来表达这一点,但是如果您想节省往返次数,可以选择执行以下操作:
排序是这里的关键——
Prime
如果有的话,它将位于最顶部。要包含更多类型,可以使用三元运算符: