Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq嵌套的select in Contains方法_C#_Sql_Linq_Select_Nested - Fatal编程技术网

C# linq嵌套的select in Contains方法

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

是否可以将其转换为单个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) 

您可以创建单独的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])
)))