簡體   English   中英

LINQ嵌套選擇包含方法

[英]linq nested select in Contains method

可以將其轉換為單個LINQ語句嗎?

SELECT COUNT(*) 
FROM Abstract_Dedications_Lookup 
WHERE PlatEntryNumber = 10383772 
AND CommonArea = 0 
AND ((OuterType <> '' AND OuterValue <> '') OR (InnerType <> '' AND InnerValue <> '')) 
AND ParcelNumber IN 
(SELECT ParentParcelNumber 
FROM Parcel_Title_History 
WHERE EntryNumber <> 10383772 
AND ParentParcelNumber <> '0' 
AND ChildParcelNumber <> ParentParcelNumber) 

我嘗試了許多變體,但無法在“ .Contains”方法中獲得正確的語法。 可以在“包含”中使用“選擇”嗎?

var query2 = from d in context.RTV_ParcelDedicationLocations
from p in context.RTV_ParcelTitleHistory
where d.PlatEntryNumber == PlatEntryNum
where d.CommonArea == false
where (d.OuterType != "" && d.OuterValue != "") || (d.InnerType != "" && d.InnerValue != "")
where d.ParcelNumber.Contains(p.ChildParcelNumber != p.ParentParcelNumber)
select d;                      
var results2 = query2.ToList();

您可以創建單獨的linq語句,該語句將由數據庫作為1個查詢執行。 linq語句主體實際上會執行,直到您開始對其進行迭代為止。

我想到此問題的方式是定義一個查詢,該查詢從Parcel_Title_History獲取有效的ParentParcelNumber。 然后創建另一個查詢,以檢查Abstract_Dedications_Lookup中的項目是否在第一個查詢中。 嘗試這樣的事情:

var query1 =  from p in context.RTV_ParcelTitleHistory
                where p.EntryNumber != 10383772 & p.ParentParcelNumber != "0" & p.ChildParcelNumber != p.ParentParcelNumber
                select p.ParentParcelNumber;

var query2 = from d in context.RTV_ParcelDedicationLocations
                where d.PlatEntryNumber == 10383772
                & d.CommonArea == 0
                & ((d.OuterType != "" && d.OuterValue != "") || (d.InnerType != "" && d.InnerValue != ""))
                & query1.Contains(d.ParcelNumber)
                select d;

var results2 = query2.ToList();

下面的LINQ生成的SQL語句返回44,092條記錄,但應與OP中返回182條記錄的SQL相同。 query2 LINQ中的某些內容顯然不正確:

SELECT 
[Extent1].[ParcelNumber] AS [ParcelNumber], 
[Extent1].[PlatEntryNumber] AS [PlatEntryNumber], 
[Extent1].[OuterType] AS [OuterType], 
[Extent1].[OuterValue] AS [OuterValue], 
[Extent1].[InnerType] AS [InnerType], 
[Extent1].[InnerValue] AS [InnerValue], 
[Extent1].[CommonArea] AS [CommonArea]
FROM (SELECT 
[RTV_ParcelDedicationLocations].[ParcelNumber] AS [ParcelNumber], 
[RTV_ParcelDedicationLocations].[PlatEntryNumber] AS [PlatEntryNumber], 
[RTV_ParcelDedicationLocations].[OuterType] AS [OuterType], 
[RTV_ParcelDedicationLocations].[OuterValue] AS [OuterValue], 
[RTV_ParcelDedicationLocations].[InnerType] AS [InnerType], 
[RTV_ParcelDedicationLocations].[InnerValue] AS [InnerValue], 
[RTV_ParcelDedicationLocations].[CommonArea] AS [CommonArea]
FROM [dbo].[RTV_ParcelDedicationLocations] AS [RTV_ParcelDedicationLocations]) AS [Extent1]
WHERE (([Extent1].[PlatEntryNumber] = 10383772) AND (10383772 IS NOT NULL) 
AND (0 = [Extent1].[CommonArea]) AND ('''' <> [Extent1].[OuterType]) AND ('''' <> [Extent1].[OuterValue])) 
OR (('''' <> [Extent1].[InnerType]) AND ('''' <> [Extent1].[InnerValue])
AND ( EXISTS (SELECT 1 AS [C1]
FROM (SELECT  [RTV_ParcelTitleHistory].[EntryNumber] AS [EntryNumber], 
[RTV_ParcelTitleHistory].[ParentParcelNumber] AS [ParentParcelNumber], 
[RTV_ParcelTitleHistory].[ChildParcelNumber] AS [ChildParcelNumber], 
[RTV_ParcelTitleHistory].[Book] AS [Book], 
[RTV_ParcelTitleHistory].[Page] AS [Page]
FROM [dbo].[RTV_ParcelTitleHistory] AS [RTV_ParcelTitleHistory]) AS [Extent2]
WHERE ( NOT (([Extent2].[EntryNumber] = 10383772) AND (10383772 IS NOT NULL))) AND ('0' <> [Extent2].[ParentParcelNumber]) AND ([Extent2].[ChildParcelNumber] <> [Extent2].[ParentParcelNumber]) AND ([Extent2].[ParentParcelNumber] = [Extent1].[ParcelNumber])
)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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