實體框架績效瓶頸:IEnumerable.Contains()
>通常會導致重大的績效問題。 這是因為EF的供應商不直接支援SQLEnumerable.Contains()
運算符。 相反,它將IN
轉換為一系列Contains()
>條件,對於大型資料集而言,它們效率非常低。
OR
讓我們檢查一個典型的情況:
ef將其轉換為比最佳的SQL查詢類似於:
<code class="language-csharp">var ids = Main.Select(a => a.Id).ToArray(); var rows = Main.Where(a => ids.Contains(a.Id)).ToArray();</code>
這個
<code class="language-sql">SELECT [Extent1].[Id] AS [Id] FROM [dbo].[Primary] AS [Extent1] WHERE [Extent1].[Id] = 1 OR [Extent1].[Id] = 2 OR [Extent1].[Id] = 3 ...</code>
績效最佳化策略OR
幾種方法可以減輕此效能問題:
槓桿>。 這允許EF Core將查詢轉換為有效的子句。
DbSet.Contains()
DbSet.Contains()
Enumerable.Contains()
apply IN
(ef6):
>
InExpression
>InExpression
資料區塊:IN
查詢。這降低了每個單獨查詢的複雜性。
原始的SQL查詢:作為最後的度假勝地,旁路Linq和ef完全透過使用IN
>運算符編寫自訂SQL查詢。 這提供了最大的控制,但犧牲了EF的ORM的好處。
替代方法:IN
>
以上是為什麼「IEnumerable.Contains()」會顯著影響實體框架效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!