我需要使用實體框架(代碼優先)列出所有訂單及其相應的客戶ID。這應該可以不查詢Customers表,因爲客戶ID是Orders表中的FK。但是,EF也會根據訂單和客戶表生成選擇。獲取相關實體ID而不加載它
這是用於查詢命令中的實體模型和代碼:
public class Order
{
public virtual Guid Id { get; set; }
public virtual string Description { get; set; }
public virtual Customer Customer { get; set; }
}
public class Customer
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
}
using (var context = new LazyLoadingEfContext())
{
foreach (var order in context.Orders)
{
Console.WriteLine("Order {0}, Customer {1}", order.Description, order.Customer.Id);
}
}
的SQL生成如下:
SELECT
1 AS [C1],
[Extent1].[Id] AS [Id],
[Extent1].[Description] AS [Description],
[Extent1].[Customer_Id] AS [Customer_Id]
FROM [dbo].[Orders] AS [Extent1]
exec sp_executesql N'SELECT
[Extent2].[Id] AS [Id],
[Extent2].[Name] AS [Name]
FROM [dbo].[Orders] AS [Extent1]
INNER JOIN [dbo].[Customers] AS [Extent2] ON [Extent1].[Customer_Id] = [Extent2].[Id]
WHERE ([Extent1].[Customer_Id] IS NOT NULL) AND ([Extent1].[Id] =
@EntityKeyValue1)',N'@EntityKeyValue1 uniqueidentifier',
@EntityKeyValue1='FF947EF3-5A3F-4A26-BDB9-039C49F559A7'
(加其它相同的與用於參數的不同值的查詢@ EntityKeyValue1)
是否有任何方法配置EF以從「父」對象檢索相關實體ID而不是加載相關實體?
BTW,我測試過使用NHibernate和只有一個查詢是對Orders表執行同樣的情景:
SELECT this_.Id as Id1_0_, this_.Description as Descript2_1_0_,
this_.Customer_id as Customer3_1_0_ FROM [Order] this_
爲什麼你要在訂單中的每個屬性之前放置虛擬? –
嘗試註釋屬性外鍵爲適當的字段... –
@BhushanFrake虛擬應只在客戶屬性(對此感到遺憾)。 – jrowies