我正在使用EF6,我想要獲得一組ID中的記錄。這是不是比這更好?
在我的測試例如我使用4個ID。
我嘗試了兩種選擇,第一種是與任何選項。
dbContext.MyTable
.Where(x => myIDS.Any(y=> y == x.MyID));
而且這種LINQ exrepsion產生的T-SQL是:
SELECT
*
FROM [dbo].[MiTabla] AS [Extent1]
WHERE EXISTS (SELECT
1 AS [C1]
FROM (SELECT
[UnionAll2].[C1] AS [C1]
FROM (SELECT
[UnionAll1].[C1] AS [C1]
FROM (SELECT
cast(130 as bigint) AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable1]
UNION ALL
SELECT
cast(139 as bigint) AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable2]) AS [UnionAll1]
UNION ALL
SELECT
cast(140 as bigint) AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable3]) AS [UnionAll2]
UNION ALL
SELECT
cast(141 as bigint) AS [C1]
FROM (SELECT 1 AS X) AS [SingleRowTable4]) AS [UnionAll3]
WHERE [UnionAll3].[C1] = [Extent1].[MiID]
)
怎樣才能被看到,T-SQL是一種 「地方存在」 使用子查詢很多和工會。
第二個選項是包含。
dbContext.MyTable
.Where(x => myIDS.Contains(x.MiID));
和T-SQL:
SELECT
*
FROM [dbo].[MiTabla] AS [Extent1]
WHERE [Extent1].[MiID] IN (cast(130 as bigint), cast(139 as bigint), cast(140 as bigint), cast(141 as bigint))
將包含被翻譯成 「在」,但查詢是簡單得多。
我已經讀過,任何它使用更快,所以我懷疑,如果任何是,雖然它乍一看更復雜,更快或沒有。
非常感謝。
編輯:我有一些測試(我不知道這是測試這個最好的方法)。
System.Diagnostics.Stopwatch miswContains = new System.Diagnostics.Stopwatch();
miswContains.Start();
for (int i = 0; i < 100; i++)
{
IQueryable<MyTable> iq = dbContext.MyTable
.Where(x => myIDS.Contains(x.MyID));
iq.ToArrayAsync();
}
miswContains.Stop();
System.Diagnostics.Stopwatch miswAny = new System.Diagnostics.Stopwatch();
miswAny.Start();
for (int i = 0; i < 20; i++)
{
IQueryable<MyTable> iq = dbContext.Mytable
.Where(x => myIDS.Any(y => y == x.MyID));
iq.ToArrayAsync();
}
miswAny.Stop();
結果是miswAny約爲850ms,miswContains約爲4251ms。
所以第二個選擇,contaions,更慢。
'Entity Framework'用'select *'生成代碼?長類型的ID是多少?你怎麼知道結果是否沒有被緩存,你是否嘗試交換查詢順序? – Ofiris 2015-02-08 20:10:08