1

現在の状況

現在、私はこのLinqクエリを持っています:

return from function in this.context.Functions
               join fp in this.context.FunctionParameters on function.FunctionID equals fp.FunctionID into functionParameters
               from functionParameter in functionParameters.DefaultIfEmpty()
               join d in this.context.Descriptions on new
                {
                    ID = (int)function.FunctionID,
                    languageID = languageID,
                    originID = (byte)origin
                }
                equals new
                {
                    ID = d.ValueID,
                    languageID = d.LanguageID,
                    originID = d.OriginID
                }
                into entityWithDescription
               from x in entityWithDescription.DefaultIfEmpty()
               select new FunctionDTO()
               {
                   Function = function,
                   Description = x
               };

これにより、関数とそのパラメーターおよび特定の説明が返されます。したがって、2 つの左外部結合を持つ選択。これはすべてうまく機能します。

問題

説明のあるオブジェクトが複数あります。説明テーブルには、これらのオブジェクトとの関係はありません (したがって、FK はありません)。したがって、上記のクエリには常に同じ部分があります。つまり、説明テーブルへの結合クエリです。

join d in this.context.Descriptions on new
            {
                ID = (int)function.FunctionID,
                languageID = languageID,
                originID = (byte)origin
            }
            equals new
            {
                ID = d.ValueID,
                languageID = d.LanguageID,
                originID = d.OriginID
            }
            into entityWithDescription

変数languageIDoriginは、メソッドで渡される 2 つのパラメーターです。はFunctionIDmyFunctionクラスのプロパティ、つまり my のプロパティentity modelです。だからそれは

public partial class Function
{
    public byte FunctionID { get; set; }

    /** Other properties **/
}

私の質問

linq常に同じクエリの一部で別のクラスを作成することは可能ですか? 同じコードを何度も複製する必要がないようにするには?

私がすでに試したこと

var query = from function in this.context.Functions
               join fp in this.context.FunctionParameters on function.FunctionID equals fp.FunctionID into functionParameters
               from functionParameter in functionParameters.DefaultIfEmpty()
               select function;

        var testResult = this.context.Descriptions.GetDescriptionsByJoin(query, languageID, origin);

そして、別のクラスの重複コード:

public static IQueryable<IEnumerable<Description>> GetDescriptionsByJoin(
        this IDbSet<Description> descriptions, IQueryable<ITranslatable> query, byte languageID, OriginEnum origin)
    {
        return from q in query
               join d in descriptions on new
                       {
                           ID = q.ValueID,
                           languageID = languageID,
                           originID = (byte)origin
                       }
                       equals new
                       {
                           ID = d.ValueID,
                           languageID = d.LanguageID,
                           originID = d.OriginID
                       }
                       into entityWithDescription
               select entityWithDescription;
    }

しかし、これにより次のエラーが発生しました。

The specified type member is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported

「valueID」を結合ステートメントのパラメーターとして使用し、その変数がエンティティ モデルで見つからないため、このエラーが発生することはわかっています (valueID は、すべてのクラスが持つインターフェイス「ITranslatable」のプロパティです)。説明が実装されます)。

前もって感謝します!

こんにちはロートン

4

1 に答える 1

1

あなたが求めているのはLinqKitだと思います。

EF は、SQL に変換できる式について面白いです。LinqKit には、これらの作業に役立つ組み込みの式ビジターがあります。

クエリ用に個別のクラスを作成するのではなく、個別のメソッドを作成することになります。次に、LinqKit が提供する拡張メソッドを使用して、それらを連鎖させることができます。

クエリ構文で使用されているのを見たことはありませんが ( from x in foo where bar select x)、私は常に拡張メソッド構文で使用しています ( foo.Where(bar))。

于 2013-10-21T08:41:00.130 に答える