2

同じ質問をする人を何度か見つけましたが、(理論的には)かなり簡単なはずですが、答えは決して満足のいくものではなかったようです。これが私の質問です:

「Company」というエンティティがあり、その中にentityCollection「Employees」(1対多)があります。すべての会社を取得する必要があり、それぞれについて、21歳を超える年齢の従業員のみが必要です。

私は試した :

Return context.Companies.Include("Employees").Where(c => c.Employees.Where(e => e.Age > 21).Count() > 0)

21を超える会社が少なくとも1つある場合は、各会社のすべての従業員が表示されるため、これは機能しません(実際には、.Any()と同じです)。

私は試した :

Return context.Companies.Include("Employees").Select(c => New Company {  
.Id = c.Id, 
.Employees = c.Employees.Where(Function(e) e.Age > 24)
}).ToList()

これも機能しませんでしたが(完璧だったと思いますが)、次のエラーが発生します。エンティティまたは複合型'MyModel.Company'をLINQtoEntitiesクエリで作成できません。

21歳以上の従業員だけですべての会社を選択するにはどうすればよいですか?現時点では、すべてを選択し、クライアント側で従業員をフィルタリングしていますが、そのソリューションは好きではありません。

誰かが私を助けることができますか?


Morteza Manavi-Parastに感謝します、それは仕事をします!

それでも、一意のクエリで実行することがEntityFrameworkに実装されていないことを私はほとんど確信していません。それはとても一般的な状況です...証明として、このフォーラムには私のような質問がたくさんあります。

私は驚いています...多分次のリリースのために?


明確にするために、クエリの結果をデータグリッドに直接バインドしているため、会社のリストが必要です。参考までに、データグリッドの行をクリックすると(会社を選択すると)、entityCollectionからの従業員(21歳以上)が入力された2番目のグリッドがあります。

4

3 に答える 3

2

会社タイプを使用する代わりに、新しい匿名タイプを選択してみましたか?

Return context.Companies.Include("Employees").Select(c => New With {
    .Id = c.Id,
    .Employees = c.Employees.Where(Function(e) e.Age > 24)
}).ToList()

(構文が少しずれている場合は申し訳ありませんが、VB.NETでLINQ /匿名型を実行してからしばらく経ちました)

于 2010-10-12T12:58:48.577 に答える
2

LINQtoEntitiesにインクルードする「条件付きの熱心な読み込み」を行う方法はありません。ただし、2つの回避策があります。最初のものはFilteredProjectionであり、Justinが提案したものですが、匿名型オブジェクトのコレクションを提供するため、すべての状況で望ましいとは限りません。

2番目の方法はTwoTrackedQueriesと呼ばれ、従業員が条件を満たす強いタイプの会社のコレクションを提供します。それがあなたが探しているものだと思います。そのためのコードは次のとおりです。

var companies = context.Companies.ToList();
var employees = context.Employee.Where(e => e.Age > 21);
foreach (var employee in employees) {
   companies.Single(c => c.CompanyID == employee.CompanyID).Employees.Add(employee);
}

別の例については、 ConditionalEagerLoadingをご覧ください。

于 2010-10-12T14:45:39.760 に答える
1

あなたはこれを考えすぎているかもしれません。Company => Employeeの関係が双方向にマッピングされている場合は、where句を指定してEmployeeを選択し、companyを含めます。

Return context.Employee.Include("Company").Where(e => e.Age > 21)
于 2010-10-12T13:01:45.207 に答える