0

以前はlinqを使用してデータベースからデータをフェッチしましたが、Linqを単独で使用するよりもLinqでCompiledQueryを使用する方がよいようです。

CompiledQueryを使用しようとしましたが、例外がスローされます。

以下は私のコードです:

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();
}

テーブルから値「PC_ID」と「USER_ID」をフェッチし、データメンバーがとC_InternetCafeを持っているmyDataModelにそれらを追加したいだけです。piduid

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

私の過失を許してください、以下は私が得た例外です。

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"
}
4

2 に答える 2

1

「ToList」をSQLに変換できないため、クエリをコンパイルできません。関数内のすべてがSQLに変換できる必要があります。ToListを削除し、コンパイルされたクエリを呼び出すときに使用します。

于 2012-08-31T04:44:22.977 に答える
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.;
    }
}
于 2012-08-31T07:42:46.570 に答える