linq返回字符串字段与字符串列表中的任何字符串相同的所有项目

时间:2014-12-03 10:55:01

标签: c# vb.net linq

我有一个SQL表存储我网站上的所有查询。数据库没有规范化,站点的目的地根据他们想要去的国家的ID存储为逗号分隔变量。

我已使用LINQ获取所有国家/地区ID的列表,并将其视为“关闭”。我想在linq中使用它来获取CSV包含任何国家ID的所有查询。

因此,例如,我的国家/地区可能会存储为列表6 | 20 | 24

我希望返回CSV值中包含任何值的所有查询。因此,如果CSV值为'18,54,23,27,6',那么它将返回该查询。我的主要问题是因为这个值存储在表中的字符串中,所以任何查找该字符串的一部分的比较都是不可用的。如果直接是SQL,我会输入where Destinations like('%6%')。对列表中的每个例子重复。

我已经去了,但它没有工作。

  • Dim count As Integer = ctx.tbl_Enquiries.Where(Function(f) f.Destinations.Contains(shorthaulIds.Any())).Count我尝试了这一点,但它与整个目标CSV进行了比较。而不是在字符串中查找字符串。

  • 我尝试将csv转换为动态列表,这显然不会起作用,因为linq中的字符串函数往往不起作用。 - 如果你对此感兴趣的话 Dim count As Integer = ctx.tbl_Enquiries.SelectMany(Function(f) f.Destinations.Split(",").Where(Function(fe) fe.Split("c").Contains(shorthaulIds.Any()))).Count

我也尝试了一些相交,但因为我还没有使用它们之前我还不确定我在做什么

对于c#用户

  • int count = ctx.tbl_Enquiries.Where(f => f.Destinations.Contains(shorthaulIds.Any())).Count

2 个答案:

答案 0 :(得分:1)

代码

shorthaulIds.Any()
如果true的计数为一个或多,则

返回shorthaulIds,否则为假。

所以代码

f.Destinations.Contains(shorthaulIds.Any())

如果询问Destinations容器是否包含true。我确定这不是你想要的。

试试这个:

 int count = ctx.tbl_Enquries
                  .Where(f => f
                               .Destinations
                               .Any(d => shortHaulIds.Contains(d))
                        )
                  .Count();

答案 1 :(得分:0)

感谢您的帮助。当我使用LinqToSQL时,我无法在主查询中使用contains。经过一番调情后我才开始工作。

感兴趣的人:

我将所有相应的查询目的地作为字符串列表,将其从linqtosql的上下文中取出。然后在下一个查询中做了一个包含。支持@IsThatSo

Dim allFrench As List(Of String) = ctx.tbl_Enquiries.Where(Function(f) f.Subjects = (",30") Or f.Subjects = (",60")).Select(Function(s) s.Destinations).ToList()

Dim count As Integer = allFrench.Where(Function(f) shorthaulIds.Any(Function(s) f.Contains(s))).Count()