Linq查询包含哪些内容

时间:2016-05-06 11:47:22

标签: performance linq where contains

我正在尝试更快地创建包含查询的linq。 该数据集包含256,999个客户端。 Ids只是一个简单的GUID列表,这个只能包含3条记录。

以下查询最多可能需要一分钟才能返回3条记录。这是因为逻辑将通过256,999记录来查看256,999条记录中是否有任何记录在3条记录的列表中。

returnItems = context.ExecuteQuery<DataClass.SelectClientsGridView>(sql).Where(x => ids.Contains(x.ClientId)).ToList();

我想查询并检查三条记录是否在256,999的底池中。所以在某种程度上这应该更快。

我不想做循环,因为3条记录可能更多(数千)。循环次数越多,db就越多。

我不想抓取所有db记录(256,999),然后执行查询,因为它需要几乎相同的时间。

如果我只从数据库中获取所有256,999的ID,则需要一秒钟。这是Ids的来源。 (过滤的,小而简单的列表)

任何想法?

由于

2 个答案:

答案 0 :(得分:0)

您已经说过&#34;我不想抓取所有数据库记录(256,999),然后进行查询,因为这需要几乎相同的时间,&#34;而且&#34;如果我从DB中获取所有256,999的Ids,则需要一秒钟。&#34;那么这真的需要&#34;同样长&#34;?

returnItems = context.ExecuteQuery<DataClass.SelectClientsGridView>(sql).Select(x => x.ClientId).ToList().Where(x => ids.Contains(x)).ToList();

不幸的是,即使这很快,也不是答案,因为您仍然需要有效的原始查询来实际提取匹配的ID的完整记录: - (

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

答案 1 :(得分:0)

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元素。由于Ids池比主池小。

我现在加速的方式是。我已经将Stinrg.Join添加到了Ids列表中,并将它们添加为主SQL中的WHERE。这样可以将时间缩短到现在的几秒钟。