2015-10-07 60 views
1

我正在开发一个使用EF 6的MVC 5应用程序。我想查询我的数据库并将值存储在一个变量中,并且如果根据给定条件存在null应执行另一个查询以返回值。在我的方法中,我有以下几点:D1作为一个参数,它有当前的日期。EF6查询之间的空(空合并运算符)

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()中检查数据的可用性,其次检索数据。但是我有一个庞大的数据库,我不想进行额外的查询。

问候

+0

'系统会因巫对象对象reference'的错误? –

回答

2

应用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); 
+0

当我没有使用.Abc.ToList()它给了我错误的LINQ实体无法识别该方法'.Models.ABC LastOrDefault [ABC](System.Linq.IQueryable'1 [.Models.ABC],System .Linq.Expressions.Expression'1 [System.Func'2 [.Models.ABC,System.Boolean]])'方法,并且此方法不能转换为存储表达式。 –

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