B で始まる「adrianMember」にリンクされたすべての「Places」をループする次の linq select クエリがあります。PlaceName のみを表示したいだけです。メンバーから場所へのナビゲーションの関連付けがありますが、場所からメンバーへの関連付けはありません。
using (var fdb = new FALDbContext())
{
var adrianMember = fdb.Members.Find(1);
foreach (string s in adrianMember.Places.Where(p=>p.PlaceName.StartsWith("B")).Select(p => p.PlaceName))
{
Console.WriteLine("- " + s);
}
}
たとえば、Findを使用しないなど、さまざまなlinq構文も試しました...
var adrianMember = fdb.Members.Where(m => m.MemberId == 1).FirstOrDefault();
2 つの linq クエリを提供します。1 つはメンバーを取得し、後で関連する場所を取得します (そして、EF に遅延読み込みを実行させることを願っています) が、それでも非常に非効率な sql になります。
using (var fdb = new FALDbContext())
{
//Need the FirstOrDefault otherwise we will return a collection (first or default will return the inner collection
//could have multiple members with multiple places
var members = fdb.Members.Where(m=>m.FirstName == "Bob");
foreach (var member in members)
{
var places = member.Places.Where(p => p.PlaceName.StartsWith("B")).Select(p => p.PlaceName);
foreach (var place in places)
{
Console.WriteLine(place);
}
}
}
SQL 出力はすべての行とすべての列を取得します
exec sp_executesql N'SELECT
[Extent1].[PlaceId] AS [PlaceId],
[Extent1].[PlaceName] AS [PlaceName],
[Extent1].[PlaceLocation] AS [PlaceLocation],
[Extent1].[Member_MemberId] AS [Member_MemberId]
FROM [dbo].[Places] AS [Extent1]
WHERE [Extent1].[Member_MemberId] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1
SQLを次のように制限する方法はありますか
SELECT PlaceName FROM Places WHERE MemberId = 1 AND PlaceName like 'B%'
私のプロジェクトでは、上記で生成された sql によってクエリが非常に遅くなる状況がいくつかあります (20 列を超えるメンバーあたり 20,000 レコード)。より多くのレコードがある場合、linq は変更を行うのに十分賢いですか?