データベースに 1 対 1 の関係があり、.Include()
EF を使用すると、実行に時間がかかる恐ろしいクエリが生成されます (複数の結合)。だから私は考えました-それらのエンティティをロードするための独自のクエリを作成します。私が試したこと:
- ExecuteStoreQuery を使用してみましたが、複雑なプロパティを具体化できないため、時間の無駄でした
- ESQL でオブジェクト クエリを使用しようとしましたが、そこに結合を追加しても、関連するプロパティが読み込まれません。そして (明らかに) を追加すると
.Include()
、EF は同じ恐ろしいクエリを生成します。
問題は、EF が生成する SQL クエリをバイパスしてエンティティを具体化する方法があるかどうかです..
更新: EF クエリの単なる例です。
コード:
var query = ctx.EntitySet
.Include("RelatedProperty")
.Where("it.SomeFilter=@param", new ObjectParameter(...));
var sql = query.ToTraceString();
そして、次のSQLが生成されます(クエリを編集して読みやすくしました):
SELECT
[Extent1].[SomeField] AS [SomeField],
/* All remaining Extent1 fields */
[Join1].[Id1] AS [Id1],
/* All remaining Join1 fields */
[Join3].[Id2] AS [Id2]
FROM [OrderSet] AS [Extent1]
LEFT OUTER JOIN (
SELECT
[Extent2].[SomeField] AS [SomeField],
/* All remaining Extent2 fields */
[Extent3].[SomeField] AS [SomeField],
/* All remaining Extent3 fields */
FROM [CustomerSet] AS [Extent2]
LEFT OUTER JOIN [OrderSet] AS [Extent3]
ON [Extent2].[Id] = [Extent3].[Customer_Id] ) AS [Join1]
ON [Extent1].[Customer_Id] = [Join1].[Id1]
LEFT OUTER JOIN (
SELECT
[Extent4].[SomeField] AS [SomeField],
/* All remaining Extent2 fields */
[Extent5].[SomeField] AS [SomeField],
/* All remaining Extent3 fields */
FROM [CustomerSet] AS [Extent4]
LEFT OUTER JOIN [OrderSet] AS [Extent5]
ON [Extent4].[Id] = [Extent5].[Customer_Id] ) AS [Join3]
ON [Extent1].[Customer_Id] = [Join3].[Id4]
WHERE [Extent1].[SomeFilter] = 'blah'