列表与linq上的数据表之间的条件连接

时间:2015-10-05 11:49:34

标签: c# linq join

这是我对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");

我需要做的是检查tescil.GtipNo(8个字符的字符串)是否以00结尾,它应该被缩减为6个字符的字符串,并在这样的连接中使用。 即;

如果是12345600,则将用作123456。

有没有办法在Linq查询中执行此操作?如果是,怎么样?

2 个答案:

答案 0 :(得分:2)

我认为你正在寻找let声明。试试这个:

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");

EDIT。解决方案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");

EDIT。 2 - 聊天后,我明白你需要什么。

要执行此类连接,您只需在equals运算符后更改部分,请参阅下文:

<column name="age" not-null="true" default="18"/> 

因此,上面的代码会将equals运算符的右侧设置为正确值,具体取决于GtipNo是否以00结尾。

答案 1 :(得分:0)

String.TrimEnd()将删除给定字符的所有尾随事件(在本例中为“0”)并返回一个新的修剪字符串。您可以在“join ... on ...”语句中使用此方法。

https://msdn.microsoft.com/en-us/library/system.string.trimend(v=vs.110).aspx

相反,只删除两个尾随零(而不是一个,三个或更多),您将需要更复杂,如另一个答案。