??(空合并运算符)在 EF6 查询之间

??(null-coalescing operator) between EF6 Queries

我正在使用 EF 6 开发 MVC 5 应用程序。我想查询我的数据库并将值存储在变量中,如果根据给定条件存在 null,则应执行另一个查询 return一个值。在我的方法中,我有如下内容:D1 作为参数出现并且它具有当前日期。

int otherYear = D1.Year + 1;
lastNo = (db.ABC.ToList().LastOrDefault(x => x.D1.Value.Month <= 6 && x.D1.Value.Year == otherYear).S1) ?? (db.ABC.ToList().LastOrDefault(x => x.D1.Value.Month > 6 && x.D1.Value.Year == D1.Year).S1);

现在执行??运算符之前的第一个查询,但是当指定条件为空时,系统会抛出对象引用错误,并且不会执行??运算符之后的第二个查询。我该如何解决?

我知道它可以通过设置 if-else 条件来解决,我应该首先检查是否有任何数据使用 .Any() 函数。但在那种情况下,我必须至少查询我的数据库 2 次。一次在 .Any() 中检查数据的可用性,第二次获取该数据。但是我有一个庞大的数据库,我不想做额外的查询。

此致

为避免重复查询问题,将查询结果存储在列表中:

int otherYear = D1.Year + 1;
List<T> myABC = db.ABC.ToList();
lastNo = (myABC.LastOrDefault(x => x.D1.Value.Month <= 6 && x.D1.Value.Year == otherYear).S1) ?? (myABC.LastOrDefault(x => x.D1.Value.Month > 6 && x.D1.Value.Year == D1.Year).S1);

您不应在应用 LastOrDefault() 之前调用 db.ABC.ToList(),因为它会将整个数据库加载到内存并从那里进行处理。

您将收到空引用异常,因为 db.ABC.LastOrDefault(x => x.D1.Value.Month <= 6 && x.D1.Value.Year == otherYear) 为空,因此您无法获得 S1 属性.

对于你的问题,我想你可以使用这个代码:

int otherYear = D1.Year + 1;
lastNo = (db.ABC.LastOrDefault(x => x.D1.Value.Month <= 6 && x.D1.Value.Year == otherYear)?.S1) ?? (db.ABC.LastOrDefault(x => x.D1.Value.Month > 6 && x.D1.Value.Year == D1.Year)?.S1);