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查询中做到这一点?如果是,怎么做?

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运算符

的解决方案2
var 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

如果只删除后面的两个零(而不是一个、三个或多个),则需要像另一个答案那样更复杂。