LINQ 的具体程度如何。包含 IEnumerable 结果?

Posted

技术标签:

【中文标题】LINQ 的具体程度如何。包含 IEnumerable 结果?【英文标题】:How specific are LINQ .Contains IEnumerable results? 【发布时间】:2017-06-19 07:14:02 【问题描述】:

假设我有一个用户表,其中有几个用户,Username 列值如下:

Ortund
Richard
Happy McHappyFace
Flapjack
Harvey
Tabitha
Asha

如果我根据用户输入在我的 LINQ 查询中使用 .Contains() 查询用户“Happy”

var users = db.Users.Where(x => x.Username.Contains("Happy")).ToList();

IEnumerable 是否会返回名称中包含 "Ha" 的每个用户记录(例如,Richard、Happy McHappyFace、Harvey、Tabitha Asha),还是只返回“Happy McHappyFace”?用户?

【问题讨论】:

你为什么不试试看呢?剧透:它不会:-) 如果您要求“Happy”,为什么它会返回所有包含“Ha”的用户? 仅返回 1 个结果,因为条件使用“快乐”。但是,如果您使用“Ha”作为标准,则有 5 个结果。 @EpicKip 请保持您的意见具有建设性。不管它是不是一个愚蠢的问题,说它是一个愚蠢的问题对任何人都没有帮助,事实上,你的评论在任何方面都没有任何帮助。 我投票决定将此问题作为题外话结束,因为它询问是否会发生特定和不合理的事情。 【参考方案1】:

为什么它会为Ha 返回任何匹配项?您专门询问名称中包含 Happy 的用户(即使是大写),因此您只会在这里得到一个结果。

【讨论】:

我想了解结果的具体程度。它是否会使用所有指定的确切字符串,或者它是否更像 SQL LIKE 查询,甚至返回与指定值的部分匹配。另外,不要粗鲁或其他任何事情,但严格来说,我不认为在您的回答中提出问题,这种事情可以算作网站上的高质量回答。 @Ortund SELECT * FROM Users WHERE Username LIKE '%Happy%' 不会返回 Harvey @Ortund 当然是。您在进行零实验或调查后提出了一个问题,使用 SO 作为基于人类的 REPL。你做了一个错误的假设,问为什么你做了这个假设是完全正确的。【参考方案2】:

documentation from String.Contains 说:

返回一个值,指示指定的子字符串是否出现在此字符串中。

所以整个匹配字符串 (Happy) 必须与输入字符串 (Happy McHappyFace) 的全部或部分匹配。它只会匹配Happy,而不匹配HHa

它将转换为where username like '%Happy%',它将仅匹配Happy McHappyFace

虽然有一个小问题(但在这种情况下不是):LINQ 有一个Contains 方法(特别是Enumerable.Contains),可以匹配签名(将匹配一个可枚举的字符,string 恰好是)。由于是扩展方法,所以属于该类的方法会优先匹配。

【讨论】:

我认为这是 linq-to-sql,所以这不是真正的 String.Contains。我刚刚删除了一条类似的评论。 String.Contains 被翻译成 LINQ-to-SQL 并不意味着它的行为会有所不同。在我看来,分析仍然成立,尽管在调用数据库时会有不同的实现。 我不明白你在说什么@JanesAbouChleih LINQ-to-SQL 将其转换为 SQL 代码。它永远不会真正调用string.Contains

以上是关于LINQ 的具体程度如何。包含 IEnumerable 结果?的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 包含 - 如何确保不跟随特定字符

如何在泛型类型中使用 linq 包含函数

我在 BDD 场景中的具体程度如何?

如何在 Linq 查询中多次包含一个表

如何使用 LINQ 查找包含 2 个逗号分隔的字符串的匹配项

在 Linq 中,如何在不使用 Count(predicate) 的情况下查找集合是不是包含元素?