[英]MySQL Entity Framework With LinQ Correlated Query Not Executing
我將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();
在上面的查詢中,如果將dm.DocumentHandle更改為12345678,則獲取的對象引用未設置為實例對象。
嘗試使用MS-SQL服務器,工作正常。
由於FirstOrDefault()
返回null,因為沒有DocumentHandle
等於dm.DocumentHandle
對象,所以會出現dm.DocumentHandle
。 將dm.DocumentHandle
更改為12345678
是dm.DocumentHandle
,因為有一個匹配的元素。
這行是問題所在:
.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
這里有兩個區別:
擺脫了位置,並將謂詞移至FirstOrDefault
調用。 這只是做以前工作的一種更清潔的方法。
添加了?
在FirstOrDefault
調用結束時。 那就是空傳播算子 。
它的作用是這樣的:
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.