2009-06-17 45 views
8

Điều này thực sự sẽ dễ dàng, nhưng tôi chỉ không thể làm việc nó ra bản thân mình, giao diện trực quan là không đủ ... :(Lựa chọn tất cả các đối tượng con trong LINQ

Hãy nói rằng tôi có một bảng State, và tôi muốn chọn tất cả Counties từ nhiều States trong SQL đó sẽ là:.

select c.* 
    from State s join County c on c.StateCode = s.StateCode 
where s.TimeZone = -5 -- or some other criteria 

Ví dụ trên là đủ tầm thường để chuyển đổi sang LINQ trong một bối cảnh tĩnh:

var q = MyDataContext.GetTable<County>().Where(c => c.State.TimeZone = -5); 

Nhưng nơi nó bắt đầu bị phức tạp là nếu tôi muốn có một bối cảnh truy vấn nhạy cảm hơn, chẳng hạn như sau:

public static List<County> GetCountiesForStates(List<State> states) { 
    // gotta do something to return all the counties for all these states 
} 

Bây giờ tôi có thể làm một cái gì đó như thế này bên trong phương pháp đó:

var q = MyDataContext.GetTable<County>().Where(c => states.Contains(c.State)); 

nhưng IMO điều đó thực sự không phù hợp, bởi vì (a) tôi phải có một static MyDataContext thay vì sử dụng bối cảnh dữ liệu ngầm của các đối tượng State và (b) bạn đang làm việc ngược, và nếu bạn bắt đầu làm phức tạp truy vấn, nó càng trở nên xấu hơn.

Có một cách để bắt đầu truy vấn với:

var q = states... // or "from s in states..." 

Theo bản năng, tôi muốn tin rằng bạn có thể làm điều này, nhưng tôi vẫn chưa tìm ra lối ...

Trả lời

26

Bạn có thể làm điều này:

var q = from c in countries 
     from s in c.States 
     where c.Property == Something 
     select s; 

này sẽ cung cấp cho bạn một điều tra của tất cả các quốc gia trong tất cả các nước. Điều này được dịch thành những điều sau đây:

var q = countries.Where(x => c.Property == Something).SelectMany(c => c.States); 
+4

+1 để bao gồm việc mở rộng lambda. –

+0

Chỉ là những gì tôi muốn - CẢM ƠN BẠN! –

+3

Chỉ cần một lỗi nhỏ - phải là "countries.Where (c => c.Property) ... –

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