??(空合并运算符)在 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);
我正在使用 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);