我将Visual Studio 2012与MySQL 5.7 Community Edition一起使用。我在以下查询中未将对象引用设置为对象的实例。
var oList = (
from dm in dbContext.document_master
join um in dbContext.user_master on dm.Alocated_CAA equals um.UserId
where (dm.DocumentHandle != null)
select new TaskLogReport
{
documentDate = dm.Document_Date,
documentHandle = dm.DocumentHandle,
fileNumber = dm.FileNumber,
statusRemarks = dbContext.statushistories
.Where(x => x.DocumentHandle == 12345678).FirstOrDefault().Remarks
}).ToList();
在上面的查询中,如果将12345678更改为dm.DocumentHandle,则获取的对象引用未设置为实例对象。
尝试使用MS-SQL服务器,工作正常。
最佳答案
因为FirstOrDefault()
返回null,所以会出现错误,因为没有对象的DocumentHandle
等于dm.DocumentHandle
。将dm.DocumentHandle
更改为12345678
是可行的,因为有一个匹配的元素。
这行是问题所在:
.Where(x => x.DocumentHandle == 12345678).FirstOrDefault().Remarks
C#的
Enumerable.FirstOrDefault()
方法返回可枚举的第一个匹配元素,或者如果没有则返回该类型的默认值。对于可空类型,如果未找到任何元素,FirstOrDefault()
将返回null。使用
12345678
时不会出错的原因是,该DocumentHandle
至少有一个匹配值。但是,将其更改为dm.DocumentHandle
时,找不到匹配的元素,导致FirstOrDefault
返回null
。然后,您基本上执行null.Remarks
,这将导致错误。您应该将代码更改为此:
.FirstOrDefault(x => x.DocumentHandle == dm.DocumentHandle)?.Remarks
这里有两个区别:
摆脱了where,并将谓词移至
FirstOrDefault
调用。这只是做以前工作的一种更清洁的方法。在
?
调用的末尾添加了FirstOrDefault
。那就是null propagation operator。它的作用是这样的:
int foo;
if (bar != null)
{
foo = bar.foo;
}
变成这个:
int foo = bar?.foo;
现在,如果存在匹配的元素,
statusRemarks
将等于第一个元素的Remarks
。否则,statusRemarks
将为null
。编辑:空传播运算符在C#6.0中实现,它是.Net 4.6及更高版本,因此在.Net 4.0中将不起作用。
您必须修改查询并实施检查,如下所示:
var oList = (
from dm in dbContext.document_master
join um in dbContext.user_master on dm.Alocated_CAA equals um.UserId
where (dm.DocumentHandle != null && dbContext.statushistories.Count(x => x.DocumentHandle == dm.DocumentHandle) > 0)
select new TaskLogReport
{
documentDate = dm.Document_Date,
documentHandle = dm.DocumentHandle,
fileNumber = dm.FileNumber,
statusRemarks = dbContext.statushistories.First(x.DocumentHandle == dm.DocumentHandle).Remarks
}).ToList();
关于c# - 不执行具有LinQ相关查询的MySQL Entity Framework ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45647960/