EF6查询之间的(null-coalescing运算符)

时间:2015-10-07 07:37:28

标签: c# entity-framework asp.net-mvc-5 linq-to-entities

我正在使用EF 6开发一个MVC 5应用程序。我想查询我的数据库并将值存储在变量中,如果根据给定的条件存在null,则应执行另一个查询以返回值。在我的方法中,我有如下: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()以检查数据的可用性,然后进入以获取数据。但我有一个庞大的数据库,我不想再进行额外的查询。

此致

2 个答案:

答案 0 :(得分:2)

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

您获得空引用异常,因为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);

答案 1 :(得分:1)

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

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