2008-10-01 37 views

Trả lời

76
 using (DataContext dc = new DataContext()) 
     { 
      var q = from t in dc.TableTests 
        group t by t.SerialNumber 
         into g 
         select new 
         { 
          SerialNumber = g.Key, 
          uid = (from t2 in g select t2.uid).Max() 
         }; 
     } 
+1

Tôi muốn chấp nhận cả hai làm câu trả lời, nhưng tôi đoán tôi không thể vì vậy tôi đã bình chọn cho cả hai người. Cảm ơn nhiều!!! –

58
var q = from s in db.Serials 
     group s by s.Serial_Number into g 
     select new {Serial_Number = g.Key, MaxUid = g.Max(s => s.uid) } 
+0

Tôi muốn chấp nhận cả hai như là câu trả lời, nhưng tôi đoán tôi không thể vì vậy tôi đã bình chọn cho cả hai bạn. Cảm ơn BUNCH !!! –

+0

Cũng lưu ý rằng biến cho biểu thức => lambda trong hàm Max có thể là bất kỳ thứ gì (s => s.uid, tv => tv.uid, asdf => asdf.uid). Linq sẽ tự động nhận ra nó như là lựa chọn trên các yếu tố của loại Serial. – Michael

21

Tôi đã kiểm tra câu trả lời DamienG trong LinqPad. Thay vì

g.Group.Max(s => s.uid) 

nên

g.Max(s => s.uid) 

Cảm ơn bạn!

+1

upvoted cho các nỗ lực thêm trong việc kiểm tra này – Michael

+7

Điều này có lẽ nên có một bình luận về câu trả lời của DamienG. –

11

Ở dạng chuỗi các phương pháp:

db.Serials.GroupBy(i => i.Serial_Number).Select(g => new 
    { 
     Serial_Number = g.Key, 
     uid = g.Max(row => row.uid) 
    }); 
5

Những câu trả lời là OK nếu bạn chỉ cần hai lĩnh vực, nhưng đối với một đối tượng phức tạp hơn, có lẽ phương pháp này có thể hữu ích:

from x in db.Serials 
group x by x.Serial_Number into g 
orderby g.Key 
select g.OrderByDescending(z => z.uid) 
.FirstOrDefault() 

. .. điều này sẽ tránh "chọn mới"

+0

Tôi thích điều này - bạn có biết liệu nó có hiệu quả như các câu trả lời khác không? – noelicus

+0

Bạn đã sử dụng cú pháp truy vấn ở đây tất cả các con đường đến cuối, nơi bạn chuyển sang cú pháp phương thức. Bạn có phải không? Là một dạng cú pháp truy vấn đầy đủ cho giải pháp của bạn? – Seth

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