如何解决List <T>加入DataTable
我有一个对象列表(lst)和数据表(dt)。我想在公共字段(代码作为字符串)上加入lst和dt,并需要返回lst中所有匹配的行。
我的列表包含两列,即代码和名称以及以下值:
code name
==== ====
1 x
2 y
3 z
DataTable包含两列,即代码和值以及以下值:
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 };
解决方法
您可以尝试以下任何一种方法。
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 });
,
您可以使用Linq查询或Join扩展方法将集合添加到代码中。只是当您从数据表中选择数据时,您需要使用dt.Field方法。请使用以下任一代码。
查询1:
var ld = lst.Join(dt.AsEnumerable(),d => d.Field<string>("code"),d) => new
{
l.code,l.name,value = d.Field<string>("value")
}).ToList();
查询2:
var ld = (from l in lst
join d in dt.AsEnumerable()
on l.code equals d.Field<string>("code")
select new
{
l.code,value = d.Field<string>("value")
}).ToList();
查询3:
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,value
}).ToList();
,
尚不清楚所需的输出是什么,但看起来好像您正确地获得了唯一的公用记录。您可以将select es.*
from employee_sequence es
where es.employee_id = 12
order by is_completed,id
limit 1;
扩展到
select
这将提供两个表中的所有数据/列。
select new { l.code,d.value }
,
尝试一下:
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 };
,
因此,您有一个列表和一个数据表。您不打算仅使用代码来使用数据表的值。
您要保留那些List项,它们的Code也是DataTable中的代码。
如果您打算将DataTable用于解决此问题的其他事情,我的建议是首先创建一个过程,将DataTable转换为可枚举的序列。
这样,您不仅可以解决此问题,还可以解决其他问题,从而添加LINQ语句。
让我们为您的DataTable创建一个扩展方法,该方法将数据转换为DataTable中的项目。参见extension methods demystified.
A,我不知道您的数据表中有什么,让我们假设您的数据表中包含Orders
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 = ...
};
}
我对DataTables并不是很熟悉,但是您知道如何将行的单元格转换为适当的值。
用法:
DataTable table = ...
Int customerId = 14;
var ordersOfThisCustomer = table.ToCustomerOrders
.Where(customerOrder => customerOrder.CustomerId == customerId)
.FirstOrDefault();
换句话说:将数据表逐行转换为CustomerOrders,并检查每个转换后的CustomerOrder是否具有等于14的CustomerId。如果找到,则停止。如果没有这样的行,则返回null。
现在您已经有了一个很好的可重用的过程,它也易于测试,调试和更改,我们可以回答您的问题。
给出一个带有CustomerOrders的数据表,以及一个包含
Code
和Name
的项目序列,仅保留序列中那些具有Code的项目,这些代码也是DataTable中的代码。
var dataTable = ... // your DataTable,filled with CustomerOrders.
var codeNames = ... // your list with Codes and Names
var codesInDataTable = dataTable.ToCustomerOrders
.Select(customerOrder => customerOrder.Code)
.Distinct();
这将创建一个可枚举的序列,该序列将逐行转换DataTable并提取属性Code。重复的代码值将被删除。
如果代码是唯一的,则不需要区分。
注意:可枚举序列尚未枚举!
var result = codeNames
.Where(codeName => codesInDataTable.Contains(codeName.Code))
.ToList();
换句话说:对于列表中的每个[代码,名称]组合,仅保留那些具有[{1]}中的代码值的[代码,名称]组合。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。