??(空合并操作符)之间的EF6查询



我正在使用EF 6开发MVC 5应用程序。我想查询我的数据库,并在一个变量中存储一个值,如果有根据给定的条件为空,那么另一个查询应执行返回一个值。在我的方法中,我有如下内容: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);

现在执行??操作符之前的第一个查询,但是当指定的条件为null时,系统抛出对象引用错误,并且不执行??操作符之后的第二个查询。我怎么解它?

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

您不应该在应用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);

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

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);

最新更新