1

私は次のエンティティモデルを持っています:従業員には会社があり、会社には従業員がいます。

以下のようにIncludeステートメントを使用する場合:

var query = context.Employees.Include(e => e.Company);
query.Dump();

関連するすべてのデータがデータベースから正しく取得されます。(Company テーブルで LEFT OUTER JOIN を使用)

System.Linq.Dynamic から GroupBy() を使用して Company.Name でグループ化すると、問題が発生します。インクルードが失われるため、Employees には Company データがありません。例:

var groupByQuery = query.GroupBy("new (Company.Name as CompanyName)", "it");
groupByQuery.Dump();

「クエリ」に適用されたインクルードを文字列コレクションとして簡単に取得して、次のように動的 GroupBy に含めることができる方法はありますか?

var groupByQuery2 = query.GroupBy("new (Company, Company.Name as CompanyName)", "it");
groupByQuery2.Dump();


ToString() 機能を使用して、次のような SQL コマンドを取得することを考えました。

string sql = query.ToString();

そして、RegEx を使用してすべての LEFT OUTER JOINS を抽出しますが、おそらくもっと良い解決策がありますか?

4

1 に答える 1

0

そもそもクエリを作成している場合-私は常にインクルードを保存することを選択します(複合クエリ/フィルタリングを作成している場合はそれらに追加します)。

たとえば、「クエリ」リターンだけを返す代わりにnew QueryContext {Query = query, Includes = ...}

もっとエレガントな解決策を見たいのですが、それが最善の策だと思います。

それ以外の場合は、式ツリー、訪問者、およびそれらすべての優れたものを見ています。
SQL 解析もそれほど単純ではありません。クエリは必ずしも単純ではないためです (多くの場合、組み合わせなど)。

たとえば、クエリ オブジェクト内に「スパン」があり (少しトラバースすると)、「インクルード」を保持しているように見えますが、あまり役に立ちません。

于 2013-04-01T01:45:49.313 に答える