实体框架6比较两个数组或序列

本文关键字:数组 两个 框架 比较 实体 | 更新日期: 2023-09-27 17:58:01

我有//说"14,15"string[]criterias=响应。MultiChoiceId.Split(',');

在数据库中,我有一个列为"14,15"。我如何使用linq和实体框架来返回匹配的行?

此外,如果我有一个值"1",我如何对上面的列/行进行类似的查询,使其不会返回"14,15"(因为该字符串中匹配1)

有几个变体,即我希望"15,14"与具有"14,15"的行匹配。

实体框架6比较两个数组或序列

string testString = "14,15";
string[] match = testString.Split(',');
var searchRows = context.Table.ToList(); //Perhaps a where clause here so you don't need to return so many rows?
var result = searchRows.Where( r => match.All( s => r.ImportantField.ToString().Split(',').Contains(s));

这将确保比较字符串中所有逗号分隔的元素都在感兴趣的数据库列中。如果您只想要这些元素,请添加一个和条件,并对计数进行检查:

var result = searchRows.Where( r => match.Length == r.ImportantField.ToString().Split(',').Length && match.All( s => r.ImportantField.ToString().Split(',').Contains(s));

除了性能特征之外,无论是什么,您都必须枚举整个集合,因为您使用的是where子句。使用"ToList"的唯一缺点是,整个事情可能会在内存中保存更长时间。

不那么简洁但更高效的查询是在Where语句中简单地使用或,就像编写查询以在SSMS中获取这些行一样。如果你想要一个更健壮的查询,你会牺牲一些性能,因为我不是LINQ to EF专家,所以我不会详细讨论LINQ提供者如何处理代码/生成了什么sql。

 var results = MyContext.MyTable.Where(x => x.TheRow == "14,15" || x.TheRow == "15,14");

不能在LINQ to Entities中使用String.Splitt()。

您可以使用条件s == "14,15" || s == "15,14"

或者,如果你想支持在任何值列表中查找14和15,或者可以尝试:

s.StartsWith("14,") || s.Contains(",14,") || s.EndsWith(",14") && s.StartsWith("15,") || s.Contains(",15,") || s.EndsWith(",15")