簡體   English   中英

不執行具有LinQ相關查詢的MySQL實體框架

[英]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更改為12345678dm.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

這里有兩個區別:

  1. 擺脫了位置,並將謂詞移至FirstOrDefault調用。 這只是做以前工作的一種更清潔的方法。

  2. 添加了? 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM