Vb.net 我只是不知道';我不知道如何使用Linq
我的课程如下:Vb.net 我只是不知道';我不知道如何使用Linq,vb.net,linq,Vb.net,Linq,我的课程如下: 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上的示例
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上的示例过于简单或过于复杂
我怎么能
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。通常,我在转换语法方面没有问题,但是对于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 ();
}
使用LINQ提供的扩展方法可能会帮助您更好地理解它
很抱歉使用C#语法,但我对VB.NET不是很熟悉。如果您想使用LINQ,我建议您阅读本页关于将LINQ与对象一起使用的内容(例如您自己的类扫描): 它应该足够直截了当地理解,而不会让你头晕 否则,我建议使用List类本身,它有许多有用的函数。请检查此处以了解相关信息:
如果c#到vb的转换错误,请道歉 我也遇到了同样的困惑。我同意文件不是很清楚。我现在在三个项目中使用LINQ,我非常喜欢它 如果您使用的是LINQ to SQL,请通过在服务器视图中创建到服务器的连接并将表拖到数据上下文中来创建LINQ类。否则,只需将db设置为扫描对象的集合 1) 获取扫描计数,按日期分组,其中Delivered=True Dim db = new BrettsDataContext Dim Query = From s as Scan in db _ Where s.Delivered = True _ Order By s.Date Dim db = new BrettsDataContext Dim Query3 = From s as Scan in db _ Where s.Delivered = True _ Order By s.State Dim db=新的BrettsDataContext Dim Query=以db为单位从s扫描_ 其中s.Delivered=True_ 按s.日期订购 2) 获取扫描计数,按设备分组,其中Delivered=True Dim db = new BrettsDataContext Dim Query2 = From s as Scan in db _ Where s.Delivered = True _ Order By s.Date Dim db=新的BrettsDataContext Dim Query2=以db为单位从s扫描_ 其中s.Delivered=True_ 按s.日期订购 3) 获取扫描计数,按状态分组,其中Delivered=True Dim db = new BrettsDataContext Dim Query = From s as Scan in db _ Where s.Delivered = True _ Order By s.Date Dim db = new BrettsDataContext Dim Query3 = From s as Scan in db _ Where s.Delivered = True _ Order By s.State Dim db=新的BrettsDataContext Dim Query3=以db为单位从s扫描_ 其中s.Delivered=True_ 美国州令 最后一个将获得所有结果行。如果您只想将计数作为一个数字: Dim count = (From s as Scan in db _ Where s.Delivered = True).Count Dim count=(以db为单位从s扫描)_ 其中s.Delivered=True)。计数 如果需要所有单独的交付日期,可以执行以下查询: Dim db = new BrettsDataContext Dim Query4 = From s as Scan in db _ Where s.Delivered = True _ Order By DeliveryDate Dim db=新的BrettsDataContext Dim Query4=以db为单位从s扫描_ 其中s.Delivered=True_ 按交货日期订购 要设置为数据源,只需执行以下操作: Dim db = new BrettsDataContext Dim Query = From s as Scan in db _ Where s.Delivered = True _ Order By s.Date gridview1.DataSource = Query Dim db=新的BrettsDataContext Dim Query=以db为单位从s扫描_ 其中s.Delivered=True_ 按s.日期订购 gridview1.DataSource=查询
希望这有帮助 您是否希望在每个交货日期进行单独计数?所以你的结果是:3个在X天交货,6个在Y天交货。。。等等,这就是你想要的吗?是什么让你认为结果不是强类型的?它们是强类型的。如果您只是运行一个普通查询(从s作为扫描选择s),它不会被强制转换为扫描,但您可以快速使用CType来执行。不需要CType-结果将是
IEnumerable
。如果只需要一个,可以调用result.First()或result.FirstOrDefault()。不过,一般来说,查询语法一开始就不那么可怕,对于那些了解SQL并且不真正了解lambda语法的人来说,这在vb.Severy中是非常可怕的。这转换为:Dim result2=扫描。其中(功能已交付)。\u分组人(职能部门和设施)选择(带有{.Facility=s.Key、.NumberOfItems=s.Count()}的新函数)丑陋。虽然这不是我最终拥有的解决方案,但正是这个答案让我走上了正确的道路。谢谢你怎么知道这里的人数?而且,LINQ不一定与数据库相关。这是LINQ到SQL。如果您想使用LINQ to对象,您不会使用datacontext,而是使用集合来代替datacontext。