2012-10-23 38 views
1

我有兩個1:n關係的實體:類別和產品。用實體框架填充子實體SqlQuery

public class Category 
{ 
    public int CategoryID { get; set; } 
    public string CategoryName { get; set; } 

    public virtual ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    public int ProductID { get; set; } 
    public string ProductName { get; set; } 

    public virtual Product { get; set; } 
} 

public class context : DbContext 
{ 
    public DbSet<Category> Categories { get; set; } 
    public DbSet<Product> Products { get; set; } 
} 

它有可能通過Eager加載來加載每個類別的產品。

context.Categories.Include(c=>c.Products).ToList() 

如何在下面的查詢中加載產品,每個類別與Eager加載相同?

var q = @" 
    SELECT Categories.* 
    JOIN Products 
    ON Category.CategoryId = Products.CategoryId"; 
var c = context.Categories.SqlQuery(q).ToList(); 

它只是一個簡單的查詢。我需要使用SqlQuery來執行一些查詢。

回答

0

根據this explanation不能:

查詢應寫入確保其僅回報實體真的是請求類型的

(我的重點)

所以它只是通過延遲加載(如果啓用),您可以加載Products的類別SqlQuery已運行,這將導致n + 1個查詢。

+1

對於Google以外的其他人,我想確保他們明白'dbContext.Database.SqlQuery ()'與'dbContext.TableName.SqlQuery()'不一樣。不同之處在於你在'Database'上調用它,併爲它提供一個類型,而不是一個表,也沒有類型。讓我困惑一點。 – TankorSmash

0

如果結果包含多個實體類型,我不認爲有可能實現從Sql查詢獲得的實體。