2010-03-22 48 views
5

Tôi có một truy vấn SQL đơn giản:hồ sơ đếm trong C# sử dụng LINQ

Select ID, COUNT(ID) as Selections, OptionName, SUM(Units) as Units 
FROM tbl_Results 
GROUP BY ID, OptionName 

Các kết quả tôi nhận được là:

'1' '4' 'Approved' '40' 
'2' '1' 'Rejected' '19' 
'3' '2' 'Not Decided' '12' 

Tôi có để mã hóa dữ liệu trong cơ sở dữ liệu, và như sáng như vậy không thể tổng hợp dữ liệu dưới dạng quan hệ. Để giải quyết vấn đề này, tôi giải mã dữ liệu trong lớp ứng dụng và muốn sử dụng LINQ để truy vấn nó ở đó. Tôi cần kết quả như sau:

'1' 'Approved'  '10' 
'3' 'Not Deceided' '6' 
'2' 'Rejected'  '19' 
'1' 'Approved'  '15' 
'1' 'Approved'  '5' 
'3' 'Not Deceided' '6' 
'1' 'Approved'  '10' 

tôi đặt những kết quả này vào lớp học và tạo ra một danh sách mạnh mẽ gõ:

public class results 
{ 
public int ID {get;set;} 
public string OptionName {get;set;} 
public int Unit {get;set;} 
} 

Tôi gần như có các truy vấn LINQ để mang lại kết quả như các truy vấn SQL về:

var q = from r in Results 
     group p.Unit by p.ID 
     int g 
     select new {ID = g.Key, 
        Selections = g.Count(), 
        Units = g.Sum()}; 

Làm cách nào để đảm bảo truy vấn LINQ của tôi cũng cung cấp cho tôi Option Name?

Nếu tôi đã tạo một lớp được gọi là Statistics để giữ kết quả của mình, làm cách nào tôi sửa đổi truy vấn LINQ để cung cấp cho tôi List<Statistics> kết quả được đặt?

public class results 
    { 
    public int ID {get;set;} 
    public int NumberOfSelections { get; set; } 
    public string OptionName {get;set;} 
    public int UnitTotal {get;set;} 
    } 

Trả lời

4

Bạn đang chỉ nhóm bởi ID. Thay vào đó, theo truy vấn ban đầu, bạn cần nhóm theo tên tùy chọn. Bằng cách đó, khóa của mỗi nhóm sẽ chứa cả ID và tên tùy chọn. Đây chỉ là thay đổi đó:

var q = from r in Results 
     group r.Unit by new { p.ID, p.OptionName } into g 
     select new { ID = g.Key.ID, 
        OptionName = g.Key.OptionName 
        Selections = g.Count(), 
        UnitTotal = g.Sum() }; 

Bây giờ, không rõ ràng với bạn rằng bạn đang chọn phần "đơn vị" cho mục nhóm. Tôi đã bỏ lỡ "nhóm p.Unit bởi" trong biểu thức truy vấn. Của tôi xấu ... nhưng những người khác có thể làm tương tự như vậy. Đây là cách thay thế, điều này làm cho nhóm chứa các mục và sau đó tính tổng số đơn vị trong phép chiếu:

var q = from r in Results 
     group r by new { p.ID, p.OptionName } into g 
     select new { ID = g.Key.ID, 
        OptionName = g.Key.OptionName 
        Selections = g.Count(), 
        UnitTotal = g.Sum(x => x.Unit) }; 
+0

Tôi rất vui vì đã mất quá nhiều thời gian để trả lời. Tôi sẽ đề nghị một cái gì đó như "nhóm kết quả bởi result.ID" và sau đó "OptionName = g.Select (result => result.OptionName). Đầu tiên()". Mà có lẽ sẽ là quá nhiều. –

1

Truy vấn này nhóm theo id và tên tùy chọn do đó làm cho nó có sẵn:

var q = from r in Results 
     group p.Unit by new { ID = p.ID, OptionName = p.OptionName } into g 
     select new { 
      ID = g.Key.ID, 
      OptionName = g.Key.OptionName, 
      Selections = g.Count(), 
      Units = g.Sum() 
     }; 

Để trở về tùy chỉnh của bạn lớp kết quả sử dụng:

var q = from r in Results 
     group p.Unit by new { ID = p.ID, OptionName = p.OptionName } into g 
     select new results() { 
      ID = g.Key.ID, 
      OptionName = g.Key.OptionName, 
      NumberOfSelections = g.Count(), 
      UnitTotal = g.Sum() 
     }; 
+1

Bạn không cần chỉ định tên cho thuộc tính trong loại ẩn danh nếu biểu thức được sử dụng để truy xuất giá trị là đã thích hợp - xem câu trả lời của tôi cho một ví dụ. –