Class Scan Delivered As Boolean ScanDate As Date State As String Facility As String End Class
然后我创建一个列表并用包含任何内容的扫描填充它.
Dim Scans As New List(Of Scan)
我需要挖掘清单以获取各种信息.我想用LINQ来做.问题是,对于我的生活,我只是没有得到它.语法将我抛弃,结果不是强类型的事实会让我失望,并且Web上的示例过于简单或过于复杂.
我怎么能
>获取扫描计数,按日期分配Delivered = True
>获取扫描计数,按设施分组,其中Delivered = True
>获取扫描计数,按状态分组,其中Delivered = True
然后我想在For Each循环中使用它.
For Each result In GroupedResults ‘My Code Next
理想情况下,我希望结果是强类型的.这可能吗?
任何人都可以推荐一些链接来开始这个?我遇到的每个网站都让我头脑发热.我根本不理解它.
编辑:
十分感谢大家.我仍然对这些东西感到头疼,但至少这是一个真实世界的例子,我可以用它来了解发生了什么.
我希望这个简单的例子可以帮助我进入一个更复杂的用途 – 没有运气.我本来应该这样做了.
所有示例似乎都使用键/值响应.如果我需要分组两个值,该怎么办?
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
是否有可能在一个结果中得到这个?
编辑编辑:
回答了我自己的编辑!这似乎对我有用:
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#. Normaly我没有转换语法的问题,但是使用LINQ并不是那么简单.我以为我做错了什么,但只是语法非常不同.
您不限于使用LINQ的查询语法.您还可以在集合上使用LINQ扩展方法.您将收到的结果将是强类型.虽然在不返回现有类型时将使用匿名类型.
下面的代码是C#,但你会明白:
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 (); }
此处的结果并非真正类型化,因为GroupBy表达式返回IGrouping类型.
但是,通过这样做,你可以解决这个问题:
var result2 = scans.Where (s => s.Delivered) .GroupBy (s => s.Facility) .Select( s => new { Facility = s.Key, NumberOfItems = s.Count() } );
使用LINQ提供的扩展方法,可能会帮助您更多地理解它.
对不起C#语法,但我对VB.NET并不熟悉.