2016-08-24 8 views
0

C#의 컴파일 쿼리에서 문자열 배열을 전달해야하지만 지원되지 않습니다. 다른 길을 줄 수 있습니까?문자열 배열이 컴파일 쿼리에서 지원되지 않습니다.

오류 : 'System.String []'유형의 'searchStrings'매개 변수가 잘못되었습니다. 스칼라 매개 변수 (예 : Int32, Decimal 및 Guid) 만 지원됩니다.

static Func<ApplicationEntitiesEntities, int, int, string,string[], IEnumerable<DAL.Participant>> GetSearchParticipantModelCompile = 
     CompiledQuery.Compile<ApplicationEntitiesEntities, int, int, string,string[], IEnumerable<DAL.Participant>>(
      (db, startIndex, recordCount, searchString,searchStrings) => (from s in db.Participants 
                  where s.IsDeleted == false && 
                  searchStrings.Contains(s.MEMBERSHIP_Users.FirstName)) 
                  orderby s.MEMBERSHIP_Users.LastName 
                  select s).Skip(startIndex).Take(recordCount)); 
+0

이렇게하면 읽을 수 있도록 포맷 해주세요. –

+4

오, 저, 그게 아주 읽을 수없는 괴물입니다. 문자열 배열을 어느 비트로 부를 수 있습니까? 왜냐하면'stringArray'는 질의가 아닌 서명에만 나타나기 때문입니다. 그래서 ... 어느 비트가 실패 했나요? "지원하지 않는"것은 무엇입니까? 그것은 런타임에 실패합니까? 그렇다면 정확한 오류 메시지는 무엇입니까? –

+0

예 코드를 제거했지만 런타임에서 오류 –

답변

0

궁극적으로 컴파일 된 쿼리는 가능한 한 미리 준비 작업을 수행하려고합니다. 이 은 입력 데이터가 정사각형 크기 인 경우 일 수 없습니다. 쿼리가 0 항목, 1 항목, 2 항목 및 200 항목에 대해 매우 다르게 보일 수 있기 때문입니다. 결과적으로 CompiledQuery은 이러한 쿼리 허용을 거부 할 수 있습니다. 옵션 :

  • 몇 가지 키 크기가 CompiledQuery를 통해 사전 생성이되지 않고 쿼리를 사용하는 default,이 미리 컴파일 된 쿼리 중 하나를 선택합니다 .Count/.Lengthswitch를 사용 미리 컴파일 된; 스택 오버플로에서 실제 예를 들어 :

    static readonly Func<DBContext, int, Post> _get1 = 
        CompiledQuery.Compile((DBContext db, int id) => db.Posts.SingleOrDefault(p => p.Id == id)); 
    static readonly Func<DBContext, int, int, IEnumerable<Post>> _get2 = 
        CompiledQuery.Compile((DBContext db, int id0, int id1) => db.Posts.Where(p => p.Id == id0 || p.Id == id1)); 
    static readonly Func<DBContext, int, int, int, IEnumerable<Post>> _get3 = 
        CompiledQuery.Compile((DBContext db, int id0, int id1, int id2) => db.Posts.Where(p => p.Id == id0 || p.Id == id1 || p.Id == id2)); 
    static readonly Func<DBContext, int, int, int, int, IEnumerable<Post>> _get4 = 
        CompiledQuery.Compile((DBContext db, int id0, int id1, int id2, int id3) => db.Posts.Where(p => p.Id == id0 || p.Id == id1 || p.Id == id2 || p.Id == id3)); 
    static readonly Func<DBContext, int, int, int, int, int, IEnumerable<Post>> _get5 = 
        CompiledQuery.Compile((DBContext db, int id0, int id1, int id2, int id3, int id4) => db.Posts.Where(p => p.Id == id0 || p.Id == id1 || p.Id == id2 || p.Id == id3 || p.Id == id4)); 
    static readonly Func<DBContext, int, int, int, int, int, int, IEnumerable<Post>> _get6 = 
        CompiledQuery.Compile((DBContext db, int id0, int id1, int id2, int id3, int id4, int id5) => db.Posts.Where(p => p.Id == id0 || p.Id == id1 || p.Id == id2 || p.Id == id3 || p.Id == id4 || p.Id == id5)); 
    

    switch (remaining) 
        { 
         case 1: results.Add(_get1(Current.DB, ids[offset++])); break; 
         case 2: results.AddRange(_get2(Current.DB, ids[offset++], ids[offset++])); break; 
         case 3: results.AddRange(_get3(Current.DB, ids[offset++], ids[offset++], ids[offset++])); break; 
         case 4: results.AddRange(_get4(Current.DB, ids[offset++], ids[offset++], ids[offset++], ids[offset++])); break; 
         case 5: results.AddRange(_get5(Current.DB, ids[offset++], ids[offset++], ids[offset++], ids[offset++], ids[offset++])); break; 
         default: results.AddRange(_get6(Current.DB, ids[offset++], ids[offset++], ids[offset++], ids[offset++], ids[offset++], ids[offset++])); break; 
        } 
    

    (예, 정말)

  • 아마도에 당신을 허용하도록 SQL Server의 STRING_SPLIT feature 2016을 사용하여 수동으로 SQL 쓰기 구분 된 값을 가진 단일 매개 변수를 전달하십시오. 해당 값을 사용할 수없는 경우 "테이블 반환 값 매개 변수"를 사용하거나 특정 런타임 쿼리에 적절한 TSQL 및 매개 변수를 생성 할 수 있습니다.

+0

방금 ​​클래스를 만들고 속성을 만듭니다. 문자열 배열로 사용하여 컴파일 쿼리로 전달 public class StringArray { public string [] str {get; 세트; } } 동일한 오류 : 'System.String []'형식의 값을 생성하기 위해 'searchStrings'매개 변수를 사용하면 컴파일 된 쿼리의 LINQ to Entities에서 지원되지 않습니다. –

관련 문제