Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表<;T>;联接数据表_C#_Linq_Model View Controller_Datatable - Fatal编程技术网

C# 列表<;T>;联接数据表

C# 列表<;T>;联接数据表,c#,linq,model-view-controller,datatable,C#,Linq,Model View Controller,Datatable,我有一个对象列表(lst)和数据表(dt)。我想在公共字段(代码为字符串)上连接lst和dt,并需要返回lst中所有匹配的行 我的列表包含两列,即代码和名称以及以下值: code name ==== ==== 1 x 2 y 3 z code value ==== ===== 3 a 4 b 5 c DataTable包含两列,即代码和值以及以下值: code name ==== ==== 1

我有一个对象列表(lst)和数据表(dt)。我想在公共字段(代码为字符串)上连接lst和dt,并需要返回lst中所有匹配的行

我的列表包含两列,即代码和名称以及以下值:

code name
==== ====    
1    x    
2    y    
3    z
code value
==== =====    
3    a    
4    b    
5    c
DataTable包含两列,即代码和值以及以下值:

code name
==== ====    
1    x    
2    y    
3    z
code value
==== =====    
3    a    
4    b    
5    c
结果是:

3   z
下面是我的代码;但我知道这不是一个正确的说法,因此我在这里征求你的意见。如果您能指导我如何写正确的声明,我将不胜感激

var ld = from l in lst
         join d in dt.AsEnumerable() on l.code equals d.code
         select new { l.code, l.name };

不清楚您所需的输出是什么,但看起来似乎您正确地获得了唯一的公共记录。您可以将
选择扩展到

select new { l.code, l.name, d.value }
这将给出两个表中的所有数据/列

code name value
==== ==== =====
  3    z     a

不清楚您所需的输出是什么,但看起来似乎您正确地获得了唯一的公共记录。您可以将
选择扩展到

select new { l.code, l.name, d.value }
这将给出两个表中的所有数据/列

code name value
==== ==== =====
  3    z     a

你可以试试下面的任何一种

var ld = from l in lst
     join d in dt.AsEnumerable() on l.code equals d.Field<int>("code")
     select new { l.code, l.name };

var ld = lst.Join(dt.AsEnumerable(), l => l.code, d => d.Field<int>("code"), (l,d) => new { l.code, l.name });
var ld=从lst中的l开始
在l.code=d.Field(“code”)上的dt.AsEnumerable()中加入d
选择新的{l.code,l.name};
var ld=lst.Join(dt.AsEnumerable(),l=>l.code,d=>d.Field(“code”),(l,d)=>new{l.code,l.name});

您可以尝试以下任一方法

var ld = from l in lst
     join d in dt.AsEnumerable() on l.code equals d.Field<int>("code")
     select new { l.code, l.name };

var ld = lst.Join(dt.AsEnumerable(), l => l.code, d => d.Field<int>("code"), (l,d) => new { l.code, l.name });
var ld=从lst中的l开始
在l.code=d.Field(“code”)上的dt.AsEnumerable()中加入d
选择新的{l.code,l.name};
var ld=lst.Join(dt.AsEnumerable(),l=>l.code,d=>d.Field(“code”),(l,d)=>new{l.code,l.name});
试试这个:

var ld = from l in lst
         join d in dt.Cast <DataRow>() on l.code equals d["code"].ToString()
         select new { l.code, l.name };
var ld=从lst中的l开始
在l.code上的dt.Cast()中加入d等于d[“code”].ToString()
选择新的{l.code,l.name};
试试这个:

var ld = from l in lst
         join d in dt.Cast <DataRow>() on l.code equals d["code"].ToString()
         select new { l.code, l.name };
var ld=从lst中的l开始
在l.code上的dt.Cast()中加入d等于d[“code”].ToString()
选择新的{l.code,l.name};

所以您有一个列表和一个数据表。您不打算使用DataTable的值,只使用代码

您希望保留那些列表项,它们的代码也是DataTable中的代码

如果您计划将DataTable用于除此之外的其他用途,我的建议是首先创建一个过程,将DataTable转换为可枚举序列

通过这种方式,您可以添加LINQ语句,不仅针对此问题,还针对其他问题

让我们为DataTable创建一个扩展方法,将数据转换为DataTable中的项。看

唉,我不知道您的数据表中有什么,让我们假设您的数据表包含
订单

class CustomerOrder
{
    public int Id {get; set;}
    public int CustomerId {get; set;}

    public int Code {get; set;}
    public string Value {get; set;} 
    ...
}
扩展类DataTable功能的扩展方法:

public static IEnumerable<Order> ToCustomerOrders(this DataTable table)
{
    return table.AsEnumerable().Select(row => new CustomerOrder
    {
        Id = ...
        CustomerId = ...
        Code = ...
        Value = ...
     };
}
换句话说:逐行将数据表转换为CustomerOrder,并检查每个转换的CustomerOrder是否具有等于14的CustomerId。如果发现,请停止。如果没有这样的行,则返回null

现在您已经有了一个很好的可重用过程,它也很容易测试、调试和更改,我们可以回答您的问题

给定一个包含CustomerOrder的数据表,以及包含
code
Name
的项目序列,仅保留序列中包含代码的项目,该代码也是数据表中的代码

这将创建一个可枚举序列,该序列将逐行转换DataTable并提取属性代码。重复的代码值将被删除

如果代码是唯一的,则不需要区分

注意:可枚举序列尚未枚举

var result = codeNames
    .Where(codeName => codesInDataTable.Contains(codeName.Code))
    .ToList();

换句话说:对于列表中的每个[Code,Name]组合,只保留那些[Code,Name]组合,这些组合的代码值也在codesInDataTable

中,因此您有一个列表和一个DataTable。您不打算使用DataTable的值,只使用代码

您希望保留那些列表项,它们的代码也是DataTable中的代码

如果您计划将DataTable用于除此之外的其他用途,我的建议是首先创建一个过程,将DataTable转换为可枚举序列

通过这种方式,您可以添加LINQ语句,不仅针对此问题,还针对其他问题

让我们为DataTable创建一个扩展方法,将数据转换为DataTable中的项。看

唉,我不知道您的数据表中有什么,让我们假设您的数据表包含
订单

class CustomerOrder
{
    public int Id {get; set;}
    public int CustomerId {get; set;}

    public int Code {get; set;}
    public string Value {get; set;} 
    ...
}
扩展类DataTable功能的扩展方法:

public static IEnumerable<Order> ToCustomerOrders(this DataTable table)
{
    return table.AsEnumerable().Select(row => new CustomerOrder
    {
        Id = ...
        CustomerId = ...
        Code = ...
        Value = ...
     };
}
换句话说:逐行将数据表转换为CustomerOrder,并检查每个转换的CustomerOrder是否具有等于14的CustomerId。如果发现,请停止。如果没有这样的行,则返回null

现在您已经有了一个很好的可重用过程,它也很容易测试、调试和更改,我们可以回答您的问题

给定一个包含CustomerOrder的数据表,以及包含
code
Name
的项目序列,仅保留序列中包含代码的项目,该代码也是数据表中的代码

这将创建一个可枚举序列,该序列将逐行转换DataTable并提取属性代码。重复的代码值将被删除

如果代码是唯一的,则不需要区分

注意:可枚举序列尚未枚举

var result = codeNames
    .Where(codeName => codesInDataTable.Contains(codeName.Code))
    .ToList();

换句话说:对于列表中的每个[Code,Name]组合,只保留那些[Code,Name]组合,这些组合的代码值也在codesInDataTable

中。您可以使用Linq查询或联接扩展方法来联接代码集合。只是当您从datatable中选择数据时,需要使用dt.Field方法。请使用以下任一代码

查询1:

var ld = lst.Join(dt.AsEnumerable(),
            l => l.code,
            d => d.Field<string>("code"),
            (l, d) => new
            {
                l.code,
                l.name,
                value = d.Field<string>("value")
            }).ToList();
var ld = (from l in lst
          join d in dt.AsEnumerable()
          on l.code equals d.Field<string>("code")
          select new
          {
              l.code,
              l.name,
              value = d.Field<string>("value")
          }).ToList();
var ld = (from l in lst
          join d in dt.AsEnumerable()
          on l.code equals d.Field<string>("code")
          let value = d.Field<string>("value")
          select new
          {
              l.code,
              l.name,
              value
          }).ToList();
var ld=lst.Join(dt.AsEnumerable(),
l=>l.code,
d=>d.字段(“代码”),
(l,d)=>新
{
l、 代码,
l、 名字,