アプリ内レポート ツールのバックエンドとして Dynamic Linq を使用していますが、1:M の関係を持つテーブルにアクセスする必要がある場所を回避できないという問題に遭遇しました。
私の単純化されたデータ構造はこれです:
これを標準の Linq でクエリする場合、次のようにクエリを記述します。
from a in context.Table_A
select new
{
a.RefNo,
val = from b in a.Table_B
where (b.A_ID == a.ID)
where (b.code == "A0001"
select(b.Value).FirstOrDefault()
}
これは問題なく動作します。ただし、Dynamic Linq を使用してクエリを実行すると、結合が機能しません。
以下のコードから、私が何を得ているかがわかりますが、明らかに「a」は使用できません。およびクエリ内の「a.Table_B」参照。このコンテキストで Table_B にアクセスできるようにするにはどうすればよいですか?
string select = "new (Ref_No,
val = from b in a.Table_B
where (b.A_ID == a.ID)
where (b.code == \"A0001\"
select(b.Value).FirstOrDefault()";
var results = context.Table_A.Select(select);
編集1:
@Hogan のコメントに答えるには - Join を使用しない理由: レポート システムは動的であり、select ステートメントが Table_B に結合している場合と結合していない場合がある (または実際に Table_B に複数回結合している) ため、結合はオプションである必要があります。これに関する私のもう 1 つの問題は、パラメーターとして文字列を渡すことができる Select メソッドとは異なり (非常に簡単に動的にすることができます)、Join() メソッドをその方法で呼び出すことができないことです。私が見つけた最も近いものは、動的な Linq join extension methodです。使用を検討する必要があるかもしれませんが、これは動的な select() では面倒だと感じています。
編集2:
ホーガンの提案に基づいて、私はこれまでに得ました:
delegate string searchTableA(Table_A a);
public void Search()
{
....
searchTableA sel = (a) =>
{
return (from b in context.Table_B
where (b.A_ID == a.ID)
select (b.Value)).FirstOrDefault();
};
var res = context.Table_A.Select(sel);
}
これにより、次のエラーが発生します。'System.Data.Entity.DbSet<TestDynamicLinqJoins.Table_A>' does not contain a definition for 'Select' and the best extension method overload 'System.Linq.Dynamic.DynamicQueryable.Select(System.Linq.IQueryable, string, params object[])' has some invalid arguments