2011-10-22 43 views
10

Tôi có hai bảng, Table1Table2. Tôi muốn thực hiện, chẳng hạn, một trái bên ngoài tham gia:Chọn tất cả các cột sau JOIN trong LINQ

var myOutput = from object1 in Table1 
       join object2 in Table2 
       on object1.Property1 equals object2.Property2 into Table3 
       from output in Table3.DefaultIfEmpty() 
       select new 
        { 
         object1.Property1, 
         object1.Property2, 
         //... 
         output.Property3, 
         output.Property4, 
         //... 
        }; 

Như bạn có thể nhận thấy, tôi muốn chọn tất cả các thuộc tính của cả hai đối tượng từ bảng kết quả (các enumerables coi khi tham gia bao gồm các đối tượng của một số loại - chúng khác nhau cho cả hai quan hệ). Tất nhiên, tôi có thể chọn các thuộc tính trong lựa chọn ẩn danh, như trong ví dụ.

Câu hỏi của tôi là cách tránh chỉ định tất cả các thuộc tính theo cách thủ công? Tôi muốn có một cái gì đó như SELECT * FROM TABLE3, trong đó TABLE3 là một quan hệ kết quả (sau khi tham gia TABLE1TABLE2).

Cảm ơn trước vì các đầu mối.

Trả lời

10

Bạn phải chỉ định từng cách thủ công nếu bạn muốn chiếu thành loại phẳng. Lựa chọn khác của bạn là chỉ có kiểu kết hợp của bạn chứa cả hai đối tượng, và các đối tượng sẽ tự nhiên mang theo thuộc tính của chúng.

select new 
{ 
    Object1 = object1, 
    Object2 = output 
}; 

Và bạn sẽ làm việc với nó như myObj.Object1.Property1, myObj.Object2.Property4 vv

Một lựa chọn cuối cùng mà vẫn bao gồm một số công việc thủ công là để xác định một loại thích hợp và có một constructor hoặc một phương pháp xây dựng mà không được làm việc phân đoạn các thuộc tính đối tượng của bạn thành một kiểu phẳng. Bạn vẫn thực hiện ánh xạ thủ công, nhưng bạn tách nó ra khỏi logic truy vấn của bạn.

select new CombinedType(object1, output); 
//or 
select builder.GetCombinedType(object1, output); 
+0

không phải tùy chọn đầu tiên sử dụng phương thức ToString() trong khi chuyển nhượng? Trong trường hợp đó tôi sẽ lấy ví dụ "Namespace.MyType" giá trị trong cột có tên Object1 sau khi làm myOutput.ToArray() ... – Jamie

+0

Không, nó sẽ không gọi 'ToString()', điều gì mang lại cho bạn ý tưởng rằng nó sẽ ? Bạn có ràng buộc nó với một điều khiển giao diện người dùng của một số loại? * Điều khiển * có thể gọi 'ToString()', nhưng bản thân truy vấn nó xác thực, tt chỉ sử dụng toàn bộ đối tượng và ánh xạ nó tới một thuộc tính. –

+0

nhận xét của bạn đã cho tôi ý tưởng - Tôi đã tạo một lớp mới chứa tham chiếu cho cả hai đối tượng. Sau đó, nó rất dễ dàng để ràng buộc với các thuộc tính nhất định trong số này :) – Jamie

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