現在の状況
現在、私はこの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
変数languageID
とorigin
は、メソッドで渡される 2 つのパラメーターです。はFunctionID
myFunction
クラスのプロパティ、つまり 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」のプロパティです)。説明が実装されます)。
前もって感謝します!
こんにちはロートン