2012-08-31 7 views
0

이전에 linq을 사용하여 데이터베이스에서 데이터를 가져 왔지만 Linq와 함께 CompiledQuery를 사용하는 것이 Linq를 단독으로 사용하는 것처럼 보입니다.어떻게 CompiledQuery를 사용할 수 있습니까?

나는 CompiledQuery를 사용하려고 시도했지만 예외가 발생합니다. 다음

내 코드입니다 :

난 그냥 테이블 C_InternetCafe에서 값 "PC_ID"와 "USER_ID"를 가져, 누구의 DataMember를 piduid을 가지고 myDataModel에 추가 할
static readonly Func<myEntity, int?, List<myDataModel>> s_compiledQuery2 = 
CompiledQuery.Compile<myEntity, int?, List<myDataModel>> 
(
    (ctx, NULLUserId) => 
    (
     from jlr in ctx.C_InternetCafe 
     where jlr.USER_ID != NULLUserId 
     select new myDataModel 
     { 
      pid = jlr.PC_ID ?? 0, 
      uid= jlr.USER_ID ?? 0 
     } 
    ).ToList() 
); 
static List<myDataModel> CompiledQuery2() 
{ 
    using (myEntity context = new myEntity()) 
    { 
     int? UserId = null; 
     List<myDataModel> orders = s_compiledQuery2.Invoke(context, UserId); 
     return orders; 
    } 
} 

public List<myDataModel> getCustomerInf() 
{ 
    return CompiledQuery2(); 
} 

.

// -------------------------------------------- --------------------------------

내 과실을 용서하십시오. 다음은 예외입니다.

NotSupportedException 
{ 
    "LINQ to Entities does not recognize the method 
    'System.Collections.Generic.List`1 
    [InternetCafeManager.Web.DataModel.myDataModel] 
    ToList[myDataModel] 
    (System.Collections.Generic.IEnumerable`1 
    [InternetCafeManager.Web.DataModel.myDataModel])' method, 
    and this method cannot be translated into a store expression" 
} 
+0

오류가 무엇입니까 ... 내가 수정 한 코드인가? 먼저 제안 된 것은 컴파일 된 쿼리 본문에서 ** ToList **를 제거하는 것입니다. – McGarnagle

답변

1

"ToList"를 sql로 변환 할 수 없기 때문에 쿼리를 컴파일 할 수 없습니다. 함수 내부의 모든 것은 sql로 변환 될 수 있어야합니다. ToList를 제거하고 컴파일 된 쿼리를 호출 할 때 사용하십시오.

0

Thx 여러분의 모든 반응. 예외가 수정되었지만 IQueryable에서 변환 한 목록에 데이터가 없습니다 (null이 아니고 count = 0). 다음

static readonly Func<myEntity, int?, IQueryable<myDataModel>> s_compiledQuery2 = 
CompiledQuery.Compile<myEntity, int?, IQueryable<myDataModel>> 
(
    (ctx, NULLUserId) => 

     from jlr in ctx.C_InternetCafe 
     where jlr.USER_ID != NULLUserId 
     select new myDataModel 
     { 
      pid = jlr.PC_ID ?? 0, 
      uid = jlr.USER_ID ?? 0 
     } 

); 
static List<myDataModel> CompiledQuery2() 
{ 
    using (myEntity context = new myEntity()) 
    { 
     int? UserId = null; 
     IQueryable<myDataModel> orders = s_compiledQuery2.Invoke(context, UserId); 
     //orders has value => orders.count() = 762k 
     List<myDataModel> tmpmodel = orders.ToList<myDataModel>(); 
     //tmpmodel has no value. => orders.count() = 0, why? 
     return tmpmodel.; 
    } 
} 
관련 문제