2015-07-02 42 views
6

Tôi muốn tìm nạp từ đối tượng phức tạp của cơ sở dữ liệu bằng cách sử dụng truy vấn đơn lẻ. Hãy xem xét ví dụ sau:Tìm nạp các đối tượng phức tạp bằng truy vấn SQL thô trong Entity Framework

SELECT TableA.*, TableB.* 
FROM TableA 
INNER JOIN TableA.B_Id = TableB.Id 

và các lớp học tương ứng:

public class QueryResult 
{ 
    public TableA A { get; set; } 
    public TableB B { get; set; } 
} 

public class TableA 
{ 
    public int Id { get; set; } 
    public string SomeContentA { get; set; } 
    public int B_Id { get; set; } 
} 

public class TableB 
{ 
    public int Id { get; set; } 
    public int SomeContentB { get; set; } 
} 

Tôi muốn thực hiện truy vấn SQL liệu từ trên cao so với cơ sở dữ liệu và nhận được bộ sưu tập của QueryResult đối tượng với thiết lập đúng A và B thuộc tính. Cho đến nay tôi đã cố gắng sử dụng phương pháp sqlquery, nhưng tôi chỉ quản lý để có được bộ sưu tập của QueryResult đối tượng với null trong A và tính B (dường như trở tập kết quả đã không binded một cách chính xác để tính):

var results = ctx.Database.SqlQuery<QueryResult>(\\example_query).ToList(); 

Lưu ý rằng:

  • Tôi không nên liệt kê các cột thủ công trong câu lệnh SELECT. Các lớp TableA và TableB và các bảng SQL có thể thay đổi theo thời gian, nhưng những thay đổi đó sẽ nhất quán.
  • Ba truy vấn (một để tìm ID từ TableA và TableB, thứ hai để tìm nạp đối tượng từ TableA, thứ ba cho các đối tượng từ TableB) sẽ làm tổn thương hiệu năng và tôi nên tránh nó nếu có thể.

Tôi đang sử dụng Entity Framework 4.3 và SQL Server 2012.

Cảm ơn, Art

+0

là 'B_Id' là khóa ngoại thực sự ở đây? Nếu vậy, có một lý do bạn không tham khảo một 'TableB' trong' TableA' của bạn để bạn có thể tải nó thông qua EF, thay vì sử dụng SQL thô? – Thewads

+0

Không, nó không phải là, tôi chỉ cần thêm nó vào ví dụ để sử dụng một tham gia. Xin lỗi vì sự nhầm lẫn. Trong bài toán thực tế không có mối quan hệ giữa TableA và TableB và không có tùy chọn để thay thế mã bằng các cấu trúc EF thông thường. –

+0

Có lý do nào để sử dụng EF4.x không? Bạn nghĩ đến việc nâng cấp lên 6.x? Ngoài ra, bạn có quyền truy cập để tạo ra một SProc trong DB để thực hiện việc tham gia phức tạp? – GoldBishop

Trả lời

0

Bạn vẫn có thể sử dụng công trình xây dựng EF thường xuyên bằng cách chỉ cần lập bản đồ lớp học của bạn vào các bảng tương ứng của họ và buộc tham gia LINQ-To-Entities:

using(var ctx = new MyDbContext()) 
{ 
    return ctx.TableA 
     .Join(ctx.TableB, a=>a.B_Id, b=>b.Id, (a,b)=> 
       new QueryResult{TableA=a, TableB=b}); 
} 

Tôi nghĩ đó là cách duy nhất, ít nhất là đến EF6.

Các vấn đề liên quan