linq上列表和数据表之间的条件连接
本文关键字:条件 连接 之间 数据表 列表 linq | 更新日期: 2023-09-27 18:15:58
这是我第一次尝试Linq。我成功地连接了一个列表和一个数据集,但连接部分仍然需要微调。Linq代码段如下:
DataTable dt = CacheManager.Gtipler.Tables[0];
List<TescilInfo> GtiplerList = new List<TescilInfo>();
//a foreach loop here to populate the list
var result = from db in dt.AsEnumerable()
join tescil in GtiplerList on db.Field<string>("Kod") equals tescil.GtipNo
select db.Field<string>("AdiTR");
我需要做的是检查它是否有效。GtipNo(一个8个字符的字符串)以00结尾,它应该减少到一个6个字符的字符串,并在这样的连接中使用。也就是说;
如果是12345600,则使用123456。
是否有办法在Linq查询中做到这一点?如果是,怎么做?
我认为你在寻找let语句。试试这个:
var result = from db in dt.AsEnumerable()
let temp = GtiplerList.Where(x => x.GtipNo.EndsWith("00")) // i assume GtipNo is a string already so no need to ToString() it
join tescil in temp on db.Field<string>("Kod") equals tescil.GtipNo.Substring(0,6) // substring to get first 6 characters
select db.Field<string>("AdiTR");
编辑。不带let运算符
的解决方案2var result = from db in dt.AsEnumerable()
join tescil in temp on db.Field<string>("Kod") equals tescil.GtipNo
where tescil.GtipNo.Substring(6,2) == "00"
select db.Field<string>("AdiTR");
编辑。2 -聊天后,我知道你需要什么。
要执行这样的连接,只需要更改等号操作符后面的部分,如下所示:
var result = from db in dt.AsEnumerable()
join tescil in GtiplerList on db.Field<string>("Kod") equals (tescil.GtipNo.EndsWith("00") ? x.Substring(0, 6) : x)
select db.Field<string>("AdiTR");
所以上面的代码会根据GtipNo是否以00结尾来设置等号运算符的右侧为正确的值
string. trimend()将删除给定字符(在本例中为'0')的所有尾随字符,并返回一个新的经过修剪的字符串。你可以在你的join…在…"声明
。https://msdn.microsoft.com/en-us/library/system.string.trimend (v = vs.110) . aspx
如果只删除后面的两个零(而不是一个、三个或多个),则需要像另一个答案那样更复杂。