我将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/

10-12 18:07