2015-07-13 44 views
0

我有一个DataTable在变量dtLatencyValues如何添加匿名类型的项目和检索项目列表

我选择这个DataTable数据到一个匿名类型的列表:

Dim _Latency = dtLatencyValues.AsEnumerable() 
        .Where(Function(x) x("Customer_Name") = str1(0).CustName AndAlso x("Site_Name") = str1(j).sitname) 
        .Select(Function(x) New With 
        { 
         .CommLat = x("Committed_Value"), 
         .ActLat = x("ActualLatencyVal"), 
         .ToContry = x("Site_To_Name") 
        }) 
        .OrderBy(Function(a) a.ToContry) 
        .DefaultIfEmpty().ToList() 

我想补充:

Dim temp = New With {.CommLat = "-", .ActLat = "-", .ToContry = str1(j).sitname} 

到我的_Latency列表,然后检索数据从最终的_Latency列表。

回答

1

您可以简单地使用AddInsert

Dim _Latency = dtLatencyValues.AsEnumerable()...ToList() 
Dim temp = New With {.CommLat = "-", .ActLat = "-", .ToContry = str1(j).sitname} 

_Latency.Insert(0, temp) ' insert as first element ' 
' or ' 
_Latency.Add(temp) ' insert as last element ' 
+0

_Latency.Insert(0,温度)它给错误“类型匿名类型的值不能转化为匿名键入“ –

+0

@ osama_1200然后仔细检查在查询中以及在创建'tmp'时是否使用了相同的匿名类型。检查属性是相同的(相同的名称,相同的类型等) – sloth

+0

我解决它在这样的:Dim tlist As New List(Of Object)tlist.Add(temp)tlist.Add(_Latency)但问题是我如何检索“tlist”的值 –

0

你可能会想设置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所示:

Watch window

+0

_Latency.Add(New with {.CommLat =“ - ”,.ActLat =“ - ”,.ToContry = str1(j).sitname})它给出错误“类型<匿名类型的值>”不能转换为<匿名类型> –

+0

@ osama_1200不知道你的DataTable和你的实际代码是什么样子,很难知道发生了什么。我将添加一个完整的工作示例,可以帮助您进行调试。 – Mark