次のクエリがあります
query.Join(
relationEntity,
entity => new { Prop1 = EF.Property<object>(entity, "Id"), Prop2 = Ef.Property...},
relation => new { Prop1 = EF.Property<object>(relation, "EntityId"), Prop2 = EF.Property... },
(Entity, Relation) => new { Entity, Relation })
実行時にキーを生成する必要があります。どうすればそれを達成できますか?実行時に式を作成しようとしましたが、Joinは受け取った値を文字どおり受け取るので、そこでメソッドを呼び出すと、結果ではなくそのメソッド名に変換されます。
私がatmでテストしている方法:
private static object MyMethod(object entity, string name)
=> new { Id = EF.Property<object>(entity, name) };
query.Join(
relationEntity,
entity => MyMethod(entity, "Id"),
relation => MyMethod(relation, "EntityId"),
(Entity, Relation) => new { Entity, Relation })
MyMethodを式にするには、次のようにアプローチする必要があります
private static Expression<Func<T, object>> MyMethod<T>(string name) =>
(T entity) => new { Id = EF.Property<object>(entity, name) };
query.Join(
relationEntity,
MyMethod<entityType>("Id"),
MyMethod<relationType>("EntityId"),
(Entity, Relation) => new { Entity, Relation })
メソッドは、計算結果ではなく、式を返す必要があります。
しかし、MyMethodが複雑になるほど、それをSQLに変換できる可能性は低くなります。
これは、コードを短くして読みやすくするためのものです。まだ動的なものはありません。
この選択はSQL-Creationの前に実行されるため、このような問題は問題になりません。
private static Expression<Func<T, object>> MyMethod<T>(string name)
{
if (case 1)
return (T entity) => new { Id = EF.Property<object>(entity, name) };
if (case 2)
return (T entity) => new { Id = EF.Property<object>(entity, name), Id2 = ... something else }
}