C# 列表<;T>;联接数据表
我有一个对象列表(lst)和数据表(dt)。我想在公共字段(代码为字符串)上连接lst和dt,并需要返回lst中所有匹配的行 我的列表包含两列,即代码和名称以及以下值: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
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、 名字,