我有一个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
我也尝试了一些相交,但因为我还没有使用它们之前我还不确定我在做什么
int count = ctx.tbl_Enquiries.Where(f => f.Destinations.Contains(shorthaulIds.Any())).Count
答案 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()