2016-06-07 68 views
1

我有以下LINQ查詢:EF4將是無效條款在where子句

var fileDocuments = (
    from doc in fileUploads 
    from invoice in 
     (
      from inv in _dbContext.SupplierInvoiceHeaders 
      where inv.InvoiceDocumentId == doc.ID || inv.JobSheetInvoiceId == doc.ID 
      select inv 
      ).DefaultIfEmpty() 
    join pos in _dbContext.PurchaseOrders on invoice.PurchaseOrder.PurchaseOrderId equals pos.PurchaseOrderId into poss 
    from po in poss.DefaultIfEmpty() 
    join hdf in _dbContext.HelpDeskFaults on po.HelpdeskFaultId equals hdf.ID into hdfpo 
    from hs in hdfpo.DefaultIfEmpty() 
    join store1 in _dbContext.Stores on hs.StoreID equals store1.ID into hsf 
    from hdfStore in hsf.DefaultIfEmpty() 
    join js in _dbContext.JobSheets on invoice.SupplierInvoiceHeaderId equals js.SupplierInvoiceHeaderID into jss 
    from jobSheets in jss.DefaultIfEmpty() 
    join ch in _dbContext.ChildProjects on po.ChildProjectId equals ch.ID into chs 
    from childProjects in chs.DefaultIfEmpty() 
    join ph in _dbContext.ProjectHeaders on childProjects.ProjectHeaderID equals ph.ID into phs 
    from projectHeaders in phs.DefaultIfEmpty() 
    join ppmsl in _dbContext.PpmScheduleLines on projectHeaders.PPMScheduleRef equals ppmsl.ID into ppsmsls 
    from ppmScheduleLines in ppsmsls.DefaultIfEmpty() 
    join ss2 in _dbContext.Stores on ppmScheduleLines.StoreID equals ss2.ID into ssts 
    from store2 in ssts.DefaultIfEmpty() 
    select new 
    { 
     doc.ID, 
     JobSheetId = jobSheets.DocumentID, 
     doc.Name, 
     doc.DateCreated, 
     doc.StoreID, 
     StoreName = doc.Store.Name, 
     DocumentType = doc.DocumentType.Name, 
     doc.DocumentTypeID, 
     HelpDeskFaultStoreName = hs.Store.Name, 
     DocStoreName = doc.Store.Name, 
     PPMScheduleLinesStoreName = ppmScheduleLines.Store.Name, 
     PIR = invoice.PurchaseInvoiceReference 
    }); 


    fileDocuments = fileDocuments.Where(x => x.PIR == jobSearchParams.PIR); 

的,其中所產生的這個樣子的條款:

WHERE ([Extent2].[fld_str_PIR] = @p__linq__0) OR (([Extent2].[fld_str_PIR] IS NULL) AND (@p__linq__0 IS NULL)) 

我不明白爲什麼它被添加IS NULL子句。

回答

1

它增加了他們,因爲你jobSearchParams.PIR可能爲空。如果它爲空,EF將假定您想要返回fld_str_PIR爲空的行。但是在SQL,你不能使用「=」操作空比較:

WHERE ([Extent2].[fld_str_PIR] = @p__linq__0) -- doesn't work if @p__linq__0 is null 

那就是爲什麼處理這種情況,你併產生這兩種情況下正確的查詢 - jobSearchParams.PIR是否爲空或不是。

+0

有無論如何我可以只生成一個平等檢查沒有不需要的IS NULL子句? – dagda1

+0

如果它是可以爲空的類型(例如string,int?等) - 我懷疑這一點。 _你可能知道它永遠不能爲空,但EF不知道這一點,我不確定是否有辦法告訴它它不能爲空。如果它是可爲空值的類型(int?) - 可以先將它的值賦給相同類型(int)的不可爲空的局部變量。但是,你有什麼樣的問題呢? – Evk

+0

我不明白,我想要做的就是生成一個WHERE子句,如: '''WHERE([Extent2] [fld_str_PIR] = @ p__linq__0))''' '''jobSearchParams.PIR'' '永遠不會爲空。 – dagda1

0

後搜索的負荷,我發現在另一個帖子裏強調了UseDatabaseNullSemantics設置:

context.Configuration.UseDatabaseNullSemantics = true;

啓用此設置,我的查詢在900毫秒,而不是超時運行。