4

linq to entity / sqlのコンパイル済みクエリでswitchステートメントのようなものを使用することは可能ですか?たとえば、データベースから並べ替えられたレコードを返す場合、必要なプロパティごとに2つのコンパイル済みクエリ(昇順と降順)を記述するのではなく、1つのコンパイル済みクエリ内でスイッチのようなステートメントを使用してさまざまなプロパティで並べ替えたいと思います。並べ替えます。これは、単純な並べ替え可能なグリッドの場合でも、最大10個のコンパイル済みクエリになる可能性があります。

T-SQLでは、このような構造がほとんどのデータベースでサポートされていると想像するので、これはcaseステートメントで簡単になります。それで、なぜlinq/entityフレームワークでサポートされないのでしょうか。

これに対する解決策はありますか?

4

1 に答える 1

3

kyndigsが彼のコメントで言及しているように、唯一の解決策は、? :三次演算子を使用してswitchステートメントを偽造することです。

        internal static readonly Func<MyEntities, long, MessageSortField, int, int, IQueryable<Model.Message>> MessagesPagedSortedAscQuery =
        CompiledQuery.Compile((MyEntities db, long folderId, MessageSortField sortField, int skip, int take) =>
        (
            sortField == MessageSortField.Date ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.Date).Skip(skip).Take(take) :
            sortField == MessageSortField.Subject ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.Subject).Skip(skip).Take(take) :
            sortField == MessageSortField.From ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.From).Skip(skip).Take(take) :
            db.Messages.Where(e => e.FolderId == folderId).Skip(skip).Take(take)
        ));
于 2010-11-01T13:19:09.293 に答える