2010-01-29 14 views
5

Tôi có một lớp học như sau:Tôi chỉ không hiểu làm thế nào để sử dụng LINQ

Class Scan 
    Delivered As Boolean 
    ScanDate As Date 
    State As String 
    Facility As String 
End Class 

sau đó tôi có thể tạo một danh sách và đưa vào đó quét có chứa bất cứ điều gì.

Dim Scans As New List(Of Scan) 

Tôi cần khai thác danh sách để nhận nhiều thông tin khác nhau. Tôi muốn sử dụng LINQ để làm điều đó. Vấn đề là vì cuộc sống của tôi, tôi không hiểu. Cú pháp ném tôi ra, thực tế là các kết quả không được đánh mạnh mẽ ném tôi đi, và các mẫu trên web là quá đơn giản, hoặc quá phức tạp.

Làm sao tôi

  1. Có được tổng số quét, nhóm lại theo ngày nơi Delivered = True
  2. Có được tổng số quét, nhóm lại theo sở nơi Delivered = True
  3. Có được tổng số quét , được nhóm theo Tiểu bang nơi Phân phối = Đúng

Tôi sau đó muốn sử dụng điều này trong vòng lặp Cho mỗi.

For Each result In GroupedResults 
    ‘My Code 

Next 

Lý tưởng nhất, tôi muốn kết quả được nhập mạnh mẽ. Điều này có thể không?

Có ai có thể giới thiệu một số liên kết để bắt đầu với điều này không? Mỗi trang web tôi đi qua chỉ được bơi đầu của tôi. Tôi không hiểu gì cả.

EDIT:

Cảm ơn bạn rất nhiều chàng trai. Tôi vẫn đang gãi đầu về công cụ này, nhưng ít nhất đây là một ví dụ thế giới thực mà tôi có thể sử dụng để có được một ý tưởng về những gì đang xảy ra.

Tôi đã hy vọng rằng ví dụ đơn giản này sẽ giúp tôi hội đồng quản trị mùa xuân thành một sử dụng phức tạp hơn - không may mắn được nêu ra. Tôi nên hỏi điều này.

Tất cả các ví dụ dường như sử dụng phản hồi khóa/giá trị. Nếu tôi có hai giá trị tôi cần được nhóm lại thì sao?

Class Scan 
     Delivered As Boolean 
     Scanned As Boolean 
     ScanDate As Date 
     State As String 
     Facility As String 
    End Class 


1. Get a count of Delivered = True, a count of Scanned=True, grouped by Date 
2. Get a count of Delivered = True, a count of Scanned=True, grouped by Facility 
3. Get a count of Delivered = True, a count of Scanned=True, grouped by State 

Có thể nhận kết quả này trong một kết quả không?

Chỉnh sửa Edit:

đáp Chỉnh sửa của riêng tôi! Điều này có vẻ phù hợp với tôi:

Dim query = From r In scans _ 
      Group r By r.ScanDate Into g = Group _ 
      Select New With _ 
      {g, .DeliveredCount = g.Count(Function(s) s.Delivered), .ScannedCount = g.Count(Function(s) s.Scanned)} 

Cảm ơn bạn rất nhiều bạn. Bạn đã cho tôi đến mức mà tôi có thể hack một giải pháp. Tôi vẫn không "nhận được" những gì tôi đang làm (Chức năng là gì?), Nhưng tôi đã có một cái gì đó để bắt đầu. Tôi dự định dành thời gian để học điều này ngay bây giờ. Tôi nghĩ những gì thực sự đã ném tôi ra là các mẫu trên mạng là C#. Normaly Tôi không có vấn đề chuyển đổi cú pháp, nhưng với LINQ này không phải là đơn giản. Tôi nghĩ rằng tôi đã làm điều gì đó sai, nhưng nó chỉ là cú pháp rất khác nhau.

+0

Bạn có muốn đếm riêng cho mỗi ngày phân phối không? Vì vậy, kết quả của bạn sẽ là: 3 đã được giao vào ngày X, 6 đã được gửi vào ngày Y ... vv Đây có phải là những gì bạn đang tìm kiếm không? –

+1

Điều gì khiến bạn nghĩ rằng kết quả không được đánh máy mạnh? –

+0

Chúng được nhập mạnh mẽ. Nếu bạn chỉ cần chạy một truy vấn vani (từ s như Scan select s) nó sẽ không được cast như là một quét, nhưng bạn chỉ có thể nhanh chóng sử dụng CType để làm như vậy. –

Trả lời

4

Bạn không bị giới hạn sử dụng cú pháp truy vấn của LINQ. Bạn cũng có thể sử dụng các phương thức mở rộng LINQ trên các bộ sưu tập.

Kết quả mà bạn sẽ nhận được sẽ được nhập mạnh mẽ. Mặc dù các loại ẩn danh sẽ được sử dụng khi bạn không trả lại loại hiện có.

Đoạn code dưới đây là C#, nhưng bạn sẽ hiểu:

static void Main(string[] args) 
{ 
    List<Scan> scans = new List<Scan>(); 

    scans.Add (new Scan (new DateTime (2010, 1, 1), true, "Facility1")); 
    scans.Add (new Scan (new DateTime (2010, 1, 1), true, "Facility2")); 
    scans.Add (new Scan (new DateTime (2010, 1, 1), false, "Facility3")); 
    scans.Add (new Scan (new DateTime (2010, 1, 26), true, "Facility1")); 

    var result1 = scans.Where (s => s.Delivered).GroupBy (s => s.ScanDate); 

    foreach(var r in result1) 
    { 
     Console.WriteLine (String.Format ("Number of delivered scans for {0}: {1}", r.Key, r.Count())); 
    } 

    var result2 = scans.Where (s => s.Delivered).GroupBy (s => s.Facility); 

    foreach(var r in result2) 
    { 
     Console.WriteLine (String.Format ("Number of delivered scans for {0}: {1}", r.Key, r.Count())); 
    } 

    Console.ReadLine(); 

} 

Kết quả ở đây là không thực sự gõ, vì một biểu groupby trả về một loại IGrouping. Tuy nhiên, bạn có thể làm được việc này, bằng cách làm này:

var result2 = scans.Where (s => s.Delivered) 
        .GroupBy (s => s.Facility) 
        .Select(s => new { Facility = s.Key, NumberOfItems = s.Count() }); 

Sử dụng phương pháp khuyến nông mà LINQ cung cấp, có lẽ có thể giúp bạn tìm hiểu nó hơn một chút.

Xin lỗi vì cú pháp C#, nhưng tôi không thực sự quen thuộc với VB.NET.

+0

nói chung mặc dù, cú pháp truy vấn là ít đáng sợ lúc đầu, cho những người biết SQL và không thực sự biết cú pháp lambda, đó là khá khủng khiếp trong vb. –

+0

Nghiêm trọng. Điều này được dịch sang: Kết quả mờ2 = quét.Where (Các chức năng được phân phối). _ GroupBy (Chức năng (s) s.Facility). _ Chọn (Chức năng mới) Với {.Facility = s.Key, .NumberOfItems = s.Count()}) Xấu xí. – Brett

+0

Mặc dù đây không phải là giải pháp cuối cùng tôi có, đó là câu trả lời đã đưa tôi đi đúng hướng. Cảm ơn! – Brett

0

Nếu bạn muốn sử dụng LINQ tôi sẽ khuyên bạn nên đọc trang này về việc sử dụng LINQ với các đối tượng (ví dụ như lớp của riêng bạn Scan):

http://msdn.microsoft.com/en-us/library/bb397937.aspx

Nó phải đủ đơn giản để hiểu mà không gây ra của bạn quay đầu. :)

Nếu không, tôi khuyên bạn nên sử dụng chính lớp List có nhiều chức năng hữu ích. Đánh dấu vào đây để biết thông tin về điều đó:

http://msdn.microsoft.com/en-us/library/d9hw1as6.aspx

2
Dim GroupedResults = from s in Scans _ 
        where Delivered _ 
        group s by ScanDate into g //edit here for the others _ 
        select new { Category = g.Key, ScanCount = g.Count() }; 

lời xin lỗi nếu C# để chuyển đổi vb là sai!

1

Tôi đã gặp nhiều sự nhầm lẫn tương tự. Tôi đồng ý rằng tài liệu không rõ ràng. Bây giờ tôi sử dụng LINQ trong ba dự án, và tôi thích nó hơn.

Nếu bạn đang sử dụng LINQ to SQL, hãy tạo lớp LINQ của bạn bằng cách tạo kết nối tới máy chủ của bạn trong Chế độ xem máy chủ và kéo bảng của bạn vào trong Ngữ cảnh dữ liệu. Nếu không, chỉ cần thiết lập db là tập hợp các đối tượng Scan của bạn.

1) Có được tổng số quét, nhóm lại theo ngày nơi Delivered = True

Dim db = new BrettsDataContext 
Dim Query = From s as Scan in db _ 
Where s.Delivered = True _ 
Order By s.Date

2) Có được tổng số quét, nhóm lại theo sở nơi Delivered = True

Dim db = new BrettsDataContext 
Dim Query2 = From s as Scan in db _ 
Where s.Delivered = True _ 
Order By s.Date

3) Nhận số lần quét, được nhóm theo Tiểu bang nơi Phân phối = True

Dim db = new BrettsDataContext 
Dim Query3 = From s as Scan in db _ 
Where s.Delivered = True _ 
Order By s.State

Điều cuối cùng sẽ nhận được tất cả lại sult hàng.Nếu bạn chỉ muốn tính như một số:

Dim count = (From s as Scan in db _ 
Where s.Delivered = True).Count

Nếu bạn muốn tất cả các ngày giao hàng riêng biệt, bạn có thể thực hiện truy vấn sau đây:

Dim db = new BrettsDataContext 
Dim Query4 = From s as Scan in db _ 
Where s.Delivered = True _ 
Order By DeliveryDate

Để thiết lập như là một nguồn dữ liệu, chỉ cần làm như sau:

Dim db = new BrettsDataContext 
Dim Query = From s as Scan in db _ 
Where s.Delivered = True _ 
Order By s.Date 

gridview1.DataSource = Query

Hy vọng điều này sẽ hữu ích!

+0

Làm thế nào để bạn nhận được Đếm ở đây? Và LINQ không nhất thiết phải liên quan đến một DB. –

+0

Đây là LINQ to SQL. Nếu bạn muốn sử dụng LINQ to Objects, bạn sẽ không sử dụng một datacontext, nhưng sử dụng bộ sưu tập thay cho DataContext. –

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