복붙노트

[SQL] 엔티티 프레임 워크는 2100 매개 변수 제한을 명중

SQL

엔티티 프레임 워크는 2100 매개 변수 제한을 명중

내가 LINQ - 투 - SQL 엔티티 프레임 워크에서 우리의 코드의 일부를 마이그레이션하고 있습니다. (여기에 설명) SQL Server에서 2100 매개 변수 제한에 반대 실행할 때 이전에, 내가 여기에 마크 Gravell에 의해 제공되는 솔루션을 사용했다. 자신의 반응에 명시된 바와 같이, 그것은 엔티티 프레임 워크 작동하지 않습니다.

나는 완전히 너무 시작 위치를 알고 표현에 미숙하지만, 내가 무엇을 찾고있어 엔티티 프레임 워크에 기본적으로 동일한 확장 메서드 만 적용하고 있습니다. 당신이 제공 할 수있는 모든 도움에 미리 감사드립니다.

해결법

  1. ==============================

    1.2100 매개 변수 제한 문제는 EF에 존재하지 않습니다.

    2100 매개 변수 제한 문제는 EF에 존재하지 않습니다.

    나는 (SQL 익스프레스 2008 R2에서) AdventureWorks 데이터베이스에 대한 테스트를 실행했습니다 내가 ProductCategoryId 값 (1, 2, 3)의 범위에있는 경우 모든 제품을 얻기 위해 노력하고있어.

    LINQ,이 같은 생성 된 SQL WHERE 절 외모를 사용 :

    WHERE [t0].[ProductCategoryID] IN (@p0, @p1, @p2)
    -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1]
    -- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [2]
    -- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [3]
    

    (이 최대 변수 번호 문제로 리드), EF 4.0은 다음과 같습니다 반면 :

    WHERE [Extent1].[ProductCategoryID] IN (1,2,3)
    

    다음으로, 나는 3000 개 값 목록 EF와 함께이를 테스트했습니다 :

    var categoryList = Enumerable.Range(1, 3000).Select(i => (int?)i).ToArray();
    
    using (var aw = new AdventureWorksEntities())
    {
        var products = aw.Products
            .Where(p => categoryList.Contains(p.ProductCategoryID))
            .ToList();
    }
    

    이것은 매우 비효율적이지만, 작업 및 예상 결과를 얻을 수 있습니다.

    그러나, 또한 그렇게처럼 LINQKit 라이브러리를 사용하여 EF와 마크 Gravell가 제공하는 InRange 확장자를 사용하는 것도 가능합니다 :

    using (var aw = new AdventureWorksEntities())
    {
        var products = aw.Products
            .AsExpandable()
            .InRange(p => p.ProductCategoryID, 1000, categoryList)
            .ToList();
    }
    

    합니다 (AsExpandable 확장자 LINQKit에서 정의 됨)

    이는 예상 된 결과를 생산하는 (덩어리에서 쿼리를 실행)하고, 목록에있는 항목의 수와 청크의 크기에 따라하는 것이 아닌 청크 솔루션보다 훨씬 더 효율적이 될 수 있습니다.

  2. from https://stackoverflow.com/questions/8898564/entity-framework-hitting-2100-parameter-limit by cc-by-sa and MIT license