你可能会想设置Option Strict On
,以帮助避免这样的一些问题。您的问题是由LINQ查询创建的匿名类型的属性全部输入为Object
,因为DataRow.Item
(代码中的x("field name")
)返回Object
。当您想要添加项目时,匿名类型需要匹配,并且AnonymousType(Of Object, Object, Object)
与AnonymousType(Of String, String, String)
不匹配。
如果您更改查询以使用正确的类型,则应该能够更轻松地添加新项目,例如, (不知道如果这些都是正确的类型为您的数据!):
Dim _Latency = dtLatencyValues.AsEnumerable() _
.Where(Function(x) x.Field(Of String)("Customer_Name") = str1(0).CustName AndAlso x.Field(Of String)("Site_Name") = str1(j).sitname) _
.Select(Function(x) New With
{
.CommLat = x.Field(Of String)("Committed_Value"),
.ActLat = x.Field(Of String)("ActualLatencyVal"),
.ToContry = x.Field(Of String)("Site_To_Name")
}) _
.OrderBy(Function(a) a.ToContry) _
.DefaultIfEmpty().ToList()
_Latency.Add(New With {.CommLat = "-", .ActLat = "-", .ToContry = str1(j).sitname})
您可能需要添加一个参考System.Data.DataSetExtensions.dll
为.Field(Of String)
通话。
编辑
下面是一个完整的工作示例 - VS2013控制台项目。
Option Strict On
Option Explicit On
Option Infer On
Module Module1
Sub Main()
Dim dtLatencyValues = New DataTable()
dtLatencyValues.Columns.Add("Customer_Name", GetType(String))
dtLatencyValues.Columns.Add("Site_Name", GetType(String))
dtLatencyValues.Columns.Add("Committed_Value", GetType(String))
dtLatencyValues.Columns.Add("ActualLatencyVal", GetType(String))
dtLatencyValues.Columns.Add("Site_To_Name", GetType(String))
dtLatencyValues.Rows.Add("CustA", "SiteA", "Com1", "Act1", "STN1")
dtLatencyValues.Rows.Add("CustA", "SiteA", "Com2", "Act2", "STN2")
dtLatencyValues.Rows.Add("CustA", "SiteB", "Com1", "Act1", "STN1")
dtLatencyValues.Rows.Add("CustB", "SiteB", "Com1", "Act1", "STN1")
Dim custName = "CustA"
Dim siteName = "SiteA"
Dim _Latency = dtLatencyValues.AsEnumerable() _
.Where(Function(x) x.Field(Of String)("Customer_Name") = custName AndAlso x.Field(Of String)("Site_Name") = siteName) _
.Select(Function(x) New With
{
.CommLat = x.Field(Of String)("Committed_Value"),
.ActLat = x.Field(Of String)("ActualLatencyVal"),
.ToContry = x.Field(Of String)("Site_To_Name")
}) _
.OrderBy(Function(a) a.ToContry) _
.DefaultIfEmpty().ToList()
_Latency.Add(New With {.CommLat = "-", .ActLat = "-", .ToContry = siteName})
End Sub
End Module
在End Sub
线设置断点和检查_Latency
所示:
_Latency.Insert(0,温度)它给错误“类型匿名类型的值不能转化为匿名键入“ –
@ osama_1200然后仔细检查在查询中以及在创建'tmp'时是否使用了相同的匿名类型。检查属性是相同的(相同的名称,相同的类型等) – sloth
我解决它在这样的:Dim tlist As New List(Of Object)tlist.Add(temp)tlist.Add(_Latency)但问题是我如何检索“tlist”的值 –