C# linq嵌套的select in Contains方法
是否可以将其转换为单个LINQ语句C# linq嵌套的select in Contains方法,c#,sql,linq,select,nested,C#,Sql,Linq,Select,Nested,是否可以将其转换为单个LINQ语句 SELECT COUNT(*) FROM Abstract_Dedications_Lookup WHERE PlatEntryNumber = 10383772 AND CommonArea = 0 AND ((OuterType <> '' AND OuterValue <> '') OR (InnerType <> '' AND InnerValue <> '')) AND ParcelNumbe
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)
您可以创建单独的linq语句,这些语句将作为一个查询由数据库执行。linq语句在您开始对其进行迭代之前实际上会一直执行 我思考这个问题的方式是定义一个查询,从Parcel_Title_历史中获取有效的ParcelNumber。然后创建另一个查询,该查询检查Abstract_Ablivations_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语句返回44092条记录,但应该与OP中返回182条记录的SQL相同。查询2 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])
)))
逻辑是正确的,它的运行使我走上了正确的轨道。我有一个内存不足的异常,可能是因为来自ParcelTitleHistory查询的结果计数有大约300000条记录,并且该大型结果集上的包含占用了大量内存。query1实际上不会返回300000行,它会在选择中创建WHERE。。。在OP中键入类似的查询。从query2中得到的计数是多少。计数?编辑:实际上我假设您使用的是实体框架,如果不是这样,那么是的,query1返回300000行。query2的计数是43909。如果上述代码不返回计数,则为True。我添加它是为了了解查询1返回了多少记录,然后将其删除。与OP中的SQL相比,query2中的计数应该是185。是的,我正在使用EF。我忘了提到内存不足异常是由我在上次尝试查询时意外添加的额外from子句引起的。我删除了它,没有更多的内存异常,但是query2中的计数仍然不正确。嗯,这太离谱了。您能写出query2.ToTraceString并与OP中的查询进行比较吗?
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])
)))