2010-10-25 43 views
5

Tôi có ba đối tượng (splistitemcollection) mà tham gia cùng nhau đang hoạt động tốt nhưng vấn đề là có một mối quan hệ giữa nhiều đối tượng và đối tượng khách hàng. Tôi cần phải lấy chỉ là đối tượng khách hàng đầu tiên cho mỗi đối tượng hợp đồng trong thời gian tham gia.LINQ Tham gia ở trên cùng 1

Đây là những gì tôi nhận được

 
(Contract)(Customer) 
12345 John Smith 
12345 Jane Smith 
67890 howard Jones 
67890 Mary Jones 

Dưới đây là những gì tôi muốn 12345 (chỉ là một trong các khách hàng, jane hoặc john)

Dưới đây là im đang hiện đang sử dụng.

var joinedResults = from SPListItem contracts in _contractList 
         join SPListItem customers in _customerList 
         on contracts["ContractNumber"] equals customers["ContractNumber"] 
         join SPListItem loans in _loanList 
         on contracts["ContractNumber"] equals loans["Contract_x0020_Number"] 
         into l from loans in l.DefaultIfEmpty() 
         select new MergedData(contracts, customers, loans); 

Trong SQL tôi muốn xác định một khoản đầu chọn trong một subquery xác định trên cùng của tôi, tôi chỉ không thể quấn quanh đầu tôi cú pháp cho não người mới LINQ của tôi.

kết quả cuối cùng

var joinedResults = from SPListItem contracts in _contractList 
     join SPListItem customers in 
     // Derived subset 
     (from SPListItem customers in _customerList 
     group customers by customers["ContractNumber"] into groupedCustomers 
     select groupedCustomers.FirstOrDefault() 
    ) on contracts["ContractNumber"] equals customers["ContractNumber"] 
     join SPListItem loans in _loanList 
     on contracts["ContractNumber"] equals loans["Contract_x0020_Number"] into l 
     from loans in l.DefaultIfEmpty() 
     select new MergedData(contracts, customers, loans); 
+0

Nhờ mọi người giúp đỡ tất cả. Sử dụng khái niệm nhóm tôi đã có thể nhận được kết quả tôi cần. Tôi thực sự di chuyển nhóm teh từ một tuyên bố riêng biệt để nội tuyến trong truy vấn. Đây là kết quả –

Trả lời

4

Tôi sẽ giải thích nó trước tiên, bởi vì LINQ đôi khi có vẻ khó hiểu. Ý tưởng là đưa truy vấn của khách hàng của bạn và nhóm theo ContractNumber và sau đó lấy đầu tiên. Nếu bạn muốn bạn có thể đặt hàng bởi một số lĩnh vực, để có được xác định hơn (luôn luôn đặt tên thấp nhất theo thứ tự chữ cái, vv) Sau đó bạn chỉ cần tham gia vào tempQuery của bạn mà về cơ bản sẽ khác biệt (ContractNumber) và khách hàng đầu tiên.

var tempQuery = from SPListItem customers in _customerList 
    group customers by customers["ContractNumber"] into gby 
    select gby.First(); 


var joinedResults = 

    from SPListItem contracts in _contractList 
    join SPListItem customer in tempQuery 
on contract["ContractNumber"] equals customer["ContractNumber"] 
    join SPListItem loans in _loanList 
on contracts["ContractNumber"] equals loans["Contract_x0020_Number"] 
into l from loans in l.DefaultIfEmpty() 
select new MergedData(
    contracts, 
    customer, 
    loans 
    ); 

} 
+0

cảm ơn bạn rất nhiều, tôi chắc chắn hiểu hơn về khái niệm chỉ hơn cú pháp mã và chắc chắn có ý nghĩa để phá vỡ sự tách biệt ra, tôi tưởng tượng đó sẽ là hiệu suất nhanh hơn thay vì phải tham gia vào mỗi hàng và sau đó chỉ lọc đầu tiên. –

+0

Máy ảo SP của tôi không hoạt động tốt vào sáng nay, vì vậy tôi chỉ thử nghiệm ở trên (Với ListItemCollection và ListItem) và nó sẽ làm những gì bạn muốn. Điều trên có ý nghĩa không? – Nix

0
var joinedResults = (from SPListItem contracts in _contractList 
         join SPListItem customers in _customerList 
         on contracts["ContractNumber"] equals customers["ContractNumber"] 
         join SPListItem loans in _loanList 
         on contracts["ContractNumber"] equals loans["Contract_x0020_Number"] 
         into l from loans in l.DefaultIfEmpty() 
         select new MergedData(contracts, customers, loans)).FirstOrDefault(); 

Chỉ cần gọi phương thức FirstOrDefault để chọn mục đầu tiên được tìm thấy.

+0

cảm ơn cho câu trả lời, và tôi nhận ra tôi đang thiếu một phần quan trọng của mô tả của tôi. Tôi muốn tất cả hồ sơ từ các hợp đồng và chỉ một trong các hồ sơ phù hợp với khách hàng. Vì vậy, về cơ bản FirstOrDefault là đúng, nhưng chỉ trên các khách hàng. Có công việc nào như vầy không? –

0

này cũng giống như một đầu (1) truy vấn điểm cho mỗi hợp đồng trả về:

var joinedResults = from SPListItem contracts in _contractList 
         join SPListItem loans in _loanList 
         on contracts["ContractNumber"] equals loans["Contract_x0020_Number"] 
         into l from loans in l.DefaultIfEmpty() 
         select new MergedData(contracts, 
         customer = _customerList.Where(c => c["ContractNumber"] == contracts["ContractNumber"].FirstOrDefault() 
         , loans); 
Các vấn đề liên quan