Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
Performance Linq查询,其中包含_Performance_Linq_Where_Contains - Fatal编程技术网

Performance Linq查询,其中包含

Performance Linq查询,其中包含,performance,linq,where,contains,Performance,Linq,Where,Contains,我正在尝试使linq where contains查询更快。 该数据集包含256999个客户端。ID只是一个简单的GUID列表,它只能包含3条记录 returnItems = context.ExecuteQuery<DataClass.SelectClientsGridView>(sql).Where(x => ids.Contains(x.ClientId)).ToList(); 下面的查询最多需要一分钟才能返回3条记录。这是因为逻辑将遍历256999记录,以查看2569

我正在尝试使linq where contains查询更快。 该数据集包含256999个客户端。ID只是一个简单的GUID列表,它只能包含3条记录

returnItems = context.ExecuteQuery<DataClass.SelectClientsGridView>(sql).Where(x => ids.Contains(x.ClientId)).ToList();
下面的查询最多需要一分钟才能返回3条记录。这是因为逻辑将遍历256999记录,以查看256999记录中是否有任何记录在3条记录的列表中

returnItems = context.ExecuteQuery<DataClass.SelectClientsGridView>(sql).Where(x => ids.Contains(x.ClientId)).ToList();
returnItems=context.ExecuteQuery(sql).Where(x=>ids.Contains(x.ClientId)).ToList();
我想通过查询来检查这三条记录是否在256999的范围内。所以在某种程度上,这应该快得多

我不想做一个循环,因为3条记录可能要多得多(数千条)。循环次数越多,对数据库的点击次数就越多

我不想对所有的db记录(256999)进行绘图,然后再进行查询,因为这将花费几乎相同的时间

如果我只从数据库中获取所有256999的ID,则需要一秒钟的时间。这就是ID的来源。(经过筛选的小而简单的列表)

有什么想法吗

谢谢你说过“我不想抓取所有的数据库记录(256999),然后再进行查询,因为这将花费几乎相同的时间”,但是“如果我只从数据库中抓取所有256999的ID,这将需要一秒钟。”那么这真的需要“同样长的时间”吗

returnItems=context.ExecuteQuery(sql).Select(x=>x.ClientId).ToList().Where(x=>ids.Contains(x)).ToList();
不幸的是,即使这很快,也不是一个答案,因为您仍然需要有效的原始查询来实际提取匹配ID的完整记录:-(

因此,添加索引可能是您最好的选择。

您说过“我不想获取所有数据库记录(256999),然后执行查询,因为这将花费几乎相同的时间”,但是“如果我仅从数据库中获取所有256999的ID,则需要一秒钟。”那么这真的需要“同样长的时间”吗

returnItems=context.ExecuteQuery(sql).Select(x=>x.ClientId).ToList().Where(x=>ids.Contains(x)).ToList();
不幸的是,即使这很快,也不是一个答案,因为您仍然需要有效的原始查询来实际提取匹配ID的完整记录:-(


因此,添加索引可能是最好的选择。

Id查询之所以更快,是因为返回了一个字段,而它只是一个表查询。 主查询包含子查询(如下),因此我通过一个快速简单的查询获取ID,然后使用ID获取更多详细信息

SELECT  Clients.Id as ClientId, Clients.ClientRef as ClientRef, Clients.Title + ' ' + Clients.Forename + ' ' + Clients.Surname as FullName, 
            [Address1] ,[Address2],[Address3],[Town],[County],[Postcode], 
            Clients.Consent AS Consent,
            CONVERT(nvarchar(10), Clients.Dob, 103) as FormatedDOB, 
            CASE WHEN Clients.IsMale = 1 THEN 'Male' WHEN Clients.IsMale = 0 THEN 'Female' END As Gender, 
            Convert(nvarchar(10), Max(Assessments.TestDate),103) as LastVisit, ";
            CASE WHEN Max(Convert(integer,Assessments.Submitted)) = 1 Then 'true' ELSE 'false' END AS Submitted, 
            CASE WHEN Max(Convert(integer,Assessments.GPSubmit)) = 1 Then 'true' ELSE 'false' END AS GPSubmit, 
            CASE WHEN Max(Convert(integer,Assessments.QualForPay)) = 1 Then 'true' ELSE 'false' END AS QualForPay, 
            Clients.UserIds AS LinkedUsers
              FROM Clients 
            Left JOIN Assessments ON Clients.Id = Assessments.ClientId
            Left JOIN Layouts ON Layouts.Id = Assessments.LayoutId
            GROUP BY Clients.Id, Clients.ClientRef, Clients.Title, Clients.Forename, Clients.Surname, [Address1] ,[Address2],[Address3],[Town],[County],[Postcode],Clients.Consent, Clients.Dob, Clients.IsMale,Clients.UserIds";//,Layouts.LayoutName, Layouts.SubmissionProcess
            ORDER BY ClientRef
我希望有一种更简单的方法来实现Contain元素,因为ID池比主池小


目前我加快它的一种方法是。我已经完成了一个Stinrg.Join到Id列表中,并将它们添加为主SQL中的WHERE。这将时间缩短到了几秒钟左右。

Id查询之所以更快,是因为返回了一个字段,而它只是一个表查询。 主查询包含子查询(如下),因此我通过一个快速简单的查询获取ID,然后使用ID获取更多详细信息

SELECT  Clients.Id as ClientId, Clients.ClientRef as ClientRef, Clients.Title + ' ' + Clients.Forename + ' ' + Clients.Surname as FullName, 
            [Address1] ,[Address2],[Address3],[Town],[County],[Postcode], 
            Clients.Consent AS Consent,
            CONVERT(nvarchar(10), Clients.Dob, 103) as FormatedDOB, 
            CASE WHEN Clients.IsMale = 1 THEN 'Male' WHEN Clients.IsMale = 0 THEN 'Female' END As Gender, 
            Convert(nvarchar(10), Max(Assessments.TestDate),103) as LastVisit, ";
            CASE WHEN Max(Convert(integer,Assessments.Submitted)) = 1 Then 'true' ELSE 'false' END AS Submitted, 
            CASE WHEN Max(Convert(integer,Assessments.GPSubmit)) = 1 Then 'true' ELSE 'false' END AS GPSubmit, 
            CASE WHEN Max(Convert(integer,Assessments.QualForPay)) = 1 Then 'true' ELSE 'false' END AS QualForPay, 
            Clients.UserIds AS LinkedUsers
              FROM Clients 
            Left JOIN Assessments ON Clients.Id = Assessments.ClientId
            Left JOIN Layouts ON Layouts.Id = Assessments.LayoutId
            GROUP BY Clients.Id, Clients.ClientRef, Clients.Title, Clients.Forename, Clients.Surname, [Address1] ,[Address2],[Address3],[Town],[County],[Postcode],Clients.Consent, Clients.Dob, Clients.IsMale,Clients.UserIds";//,Layouts.LayoutName, Layouts.SubmissionProcess
            ORDER BY ClientRef
我希望有一种更简单的方法来实现Contain元素,因为ID池比主池小


目前我加快速度的一种方法是。我做了一次尝试。加入Id列表,并将它们添加为主SQL中的WHERE。这将时间缩短到了几秒钟左右。

如果您使用的是原始SQL,您可以在SQL本身中完成。
从表A中选择Id,其中Id位于(11,12,13)
数据库中适当的索引将提高性能为什么使用
ExecuteQuery
而不是
DbSet
?上下文返回的类型是什么。ExecuteQuery?执行查询返回的类型是一个数据类,我创建该数据类是为了匹配SQL SELECT。就像对于复杂的linqYou co一样uld尝试
IndexOf()>=0
,以防万一它在这里也有帮助。(当然,它不应该:-|)如果您使用的是原始sql,您可以在sql本身中进行操作。
从表A中选择Id,其中Id位于(11,12,13)
数据库中适当的索引将提高性能为什么使用
ExecuteQuery
而不是
DbSet
?上下文返回的类型是什么。ExecuteQuery?执行查询返回的类型是一个数据类,我创建该数据类是为了匹配SQL SELECT。就像对于复杂的linqYou co一样uld尝试
IndexOf()>=0
,以防万一它在这里也有帮助。(当然,它不应该:-|)