2013-07-11 57 views
1

在NHibernate中,當我們執行一個如下所示的查詢時,爲其生成的SQL將包含集合中每個元素的參數。如果查詢是針對MSSQL Server執行的,並且集合中有2k個或更多元素,則會出現錯誤,因爲sql引擎允許的最大參數爲2k。EF:在LINQ查詢中使用Contains時什麼是SQL輸出?

var bankaccounts = from b in this.unitOfWork.BankAccounts 
        where command.Ids.Contains(b.Id) // command.ids is an array with id's 
        select b; 

對不起懶惰用的EntityFramework測試這個自己,但我看到其他開發人員編寫這樣的代碼:是什麼SQL將從EF生成EF cannot delete child object because of associationset

的問題對於這種疑問?

+1

您可以使用SQL查看生成的SQL腳本SQL Management Studio的事件探查器 – Martijn

回答

2

我看過SQL分析器爲你。這是實體框架發生了什麼(我quess這是笏的NHibernate還將產品,但我不知道..):

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[AccountNo] AS [AccountNo], 
[Extent1].[Name] AS [Name], 
[Extent1].[Description] AS [Description], 
[Extent1].[IBAN] AS [IBAN], 
[Extent1].[IsActive] AS [IsActive], 
[Extent1].[Customer_Id] AS [Customer_Id] 
FROM [dbo].[BankAccounts] AS [Extent1] 
WHERE [Extent1].[Id] IN (4,5,6,7,9) 

正如你所看到的,它會成爲一個WHERE .. IN ([the contains values])

+0

您能否確認這裏的數字'IN(4,5,6,7,9)'不作爲參數傳遞?如果他們不是這樣的,這聽起來是EF處理這種情況非常糟糕:(爲10x爲我檢查了這一點 – mynkow

+1

不,他們沒有作爲參數傳入我已經從SQL提供程序複製SQL語句到這個答案。 – Martijn

2

隨着此查詢,

var ids = context.Countries 
     .Take(10).Select(c => c.CountryId).ToList(); 

    var offices = context.Offices.Where(o => ids.Contains(o.CountryId)) 
     .ToList(); 

就會產生此SQL:

SELECT 
[Extent1].[OfficeId] AS [OfficeId], 
[Extent1].[CountryId] AS [CountryId], 
[Extent1].[OfficeName] AS [OfficeName] 
FROM [dbo].[Office] AS [Extent1] 
WHERE [Extent1].[CountryId] IN (3,4,5,6,7,8,9,10,11,12)