我正在使用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);