2011-11-30 32 views
5

Tôi có cơ sở dữ liệu với hai bảng sau: CustomerCustomerStatus. CustomerStatus là một bảng được gọi là chỉ đọc. Tất cả các thay đổi đối với kết quả trạng thái của khách hàng trong một INSERT vào bảng đó. Trạng thái khách hàng hiện tại có thể định vị qua CustomerStatus.StatusTimestamp.Cách bao gồm một hàng cụ thể từ một bảng khác với LINQ đến đối tượng

Bây giờ tôi đang tìm một truy vấn LINQ to entity tải tất cả Khách hàng cùng với trạng thái hiện tại của họ. Một cái gì đó như

.Include("CustomerStatus.OrderByDescending(StatusTimestamp).FirstOrDefault()").

Tôi chưa tìm được cách phù hợp với EF 4.0.

workaround hiện tại của tôi là rất xấu xí và sử dụng 2 bước sau:

bước 1: LINQ truy vấn mà nạp tất cả các trạng thái (trong kinh doanh/lớp dữ liệu):

var r = from c in db.Customers.Include("CustomerStatus") select c;

bước 2: lấy tình trạng phù hợp từ mỗi khách hàng trong GUI (trong một vòng lặp trong một cái nhìn MVC3):

c.CustomerStatus.OrderByDescending(i => i.StatusTimestamp).FirstOrDefault()

Bất kỳ ý tưởng làm thế nào điều này có thể được thực hiện trực tiếp trong một bước?

Trả lời

2

EF là mạnh mẽ hơn bạn cho nó tín dụng cho. Một trong những điều nó có thể làm là chiếu các loại phức tạp trong một số IQueryable (ví dụ: trong một lần truy cập cơ sở dữ liệu). Điều này sẽ làm việc:

var data = 
    from c in db.Customers 
    select new { 
     Customer = c, 
     LastStatus = c.CustomerStatus // assuming navigation property set up right 
         .OrderByDescending(s => s.StatusTimestamp) 
         .FirstOrDefault() 
    }; 

Bây giờ data là một IQueryable<anonymous_type>, và mỗi mục có một tài sản cho khách hàng Customer, và một LastStatus đưa ra các trạng thái mới nhất-timestamped, hoặc null nếu không có bất cứ hồ sơ cho biết trạng thái khách hàng.

Bạn cũng có thể sử dụng loại được đặt tên ở đây, tôi chỉ cần nhập nhanh hơn theo cách này :).

+0

Hoạt động tốt. Cảm ơn! Thực ra tôi vẫn làm điều đó trong 3 bước, nhưng tất cả trong BLL bây giờ: 1: 'var q = ...'. 2: 'var l = q.ToList()' (để bắt buộc tải trạng thái xuống). 3: 'return l.Select (i => i.Customer)' (để vẫn trả về một số IEnumerable và không phải là loại ẩn danh). – mkva

-1

Một cái gì đó như thế này ??

var r = (from c in db.Customers.Include("CustomerStatus") 
      where c.CustomerStatus.OrderByDescending(i => i.StatusTimestamp) 
      select c).FirstOrDefault() 
+0

Bạn có thể nhận xét về lý do điều này không hữu ích không? –

+0

Vì nó không biên dịch! – AakashM

+1

Nhưng đó chỉ là một người bạn đời giả. Làm thế nào tôi có thể biết khách hàng và lớp CustomerStatus nắm giữ những gì? –

0

Tôi không chắc chắn cách giản đồ của bạn trông giống như nhưng những gì về

var query = from c in db.Customers 
      join CustomerStatus s on c.StatusTimestamp = s.StatusTimestamp 
      order by s.StatusTimestamp 
      select c; 
Các vấn đề liên quan