2011-10-19 23 views
9

Với Entities POCO Mã đầu tiên sauPopulating sở hữu con với Entity Framework sqlquery

public class Customer 
{ 
    public int CustomerId { get; set; } 
    public string CustomerTitle { get; set; } 
    public string CustomerFirstName { get; set; } 
    public string CustomerLastName { get; set; } 

    public ICollection<Order> Orders { get; set; } 
} 

public class Order 
{ 
    public int OrderId { get; set; } 
    ... 
    public int CustomerId { get; set; } 

    public Customer Customer { get; set; } 
} 

Sử dụng LINQ bạn có thể nhận các đơn đặt hàng điền vào bằng cách sử dụng Bao gồm tài sản như trong

var cust = (from cust in context.Customer 
      where cust.CustomerId == 1 
      select cust) 
      .Include(ord => ord.Orders) 
      .FirstOrDefault(); 

tôi đang cố gắng để có được kết quả tương tự bằng cách sử dụng sql paramaterised, sử dụng

 Customer co = context.Customer.SqlQuery(
        @"select [Customer].[CustomerId], 
          ... 
          [Order].[OrderId] AS [OrderId], 
          ... 
          from Customer join Order on Customer.CustomerId = Order.CustomerId where Customer.CustomerId = @custid", sqlParm) 
       .FirstOrDefault(); 

Làm cách nào để tôi t các đơn đặt hàng trong co.Orders được dân cư với các lệnh trên, nó có vẻ như tôi không thể sử dụng tuyên bố bao gồm với SqlQuery. Đây là một ví dụ rất đơn giản chỉ nhằm mục đích minh họa, các truy vấn thực tế sẽ được tham gia nhiều hơn.

Trả lời

11

Điều này hoàn toàn không thể thực hiện được. Việc thực thi SQL trực tiếp không cung cấp các thuộc tính điều hướng và bạn thực sự không thể sử dụng Bao gồm. Bạn phải thực thi hai truy vấn SQL riêng biệt để có được CutomerOrders của mình.

0

Tôi đã sử dụng cấu trúc lớp sau như workaround:

public class Customer 
{ 
    public int CustomerId { get; set; } 
} 

public class Order 
{ 
    public Customer Customer { get; set; } 
    private int _customerId; 
    private int CustomerId { get { return _customerId; } set { Customer.CustomerId = _customerId = value; } } 
    public Order() 
    { 
     Customer = new Customer(); 
    } 
} 

Trong trường hợp này, bạn không cần phải chạy truy vấn hai lần, và truy vấn sau đây sẽ cung cấp cho các đơn đặt hàng với khách hàng:

db.Database.SqlQuery ("select cu.CustomerId, ord.OrderId từ lệnh ord join Customer cu trên cu.CustomerId = ord.CustomerId"). ToList();

0

Điều gì làm việc cho tôi là truy cập thành viên liên quan trước khi sử dụng được đóng.

public static Customer GetCustomer (int custid) 
{ 
Customer co = null; 

using (var context = new YourEntities()) 
{ 
    // your code 
    co = context.Customer.SqlQuery(
    @"select [Customer].[CustomerId], 
    ... 
    [Order].[OrderId] AS [OrderId], 
    ... 
    from Customer join Order on Customer.CustomerId = Order.CustomerId where Customer.CustomerId = @custid", sqlParm) 
    .FirstOrDefault(); 


    // my addition 
    // cause lazy loading of Orders before closing the using 
    ICollection<Order> orders = co.Orders; 

    } 

    // can access co.Orders after return. 
    return (co); 
} 
+0

FirstOrDefault() làm cho truy vấn được thực thi, vì vậy điều này thực sự bằng thực hiện hai truy vấn –