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 查询,甚至返回与指定值的部分匹配。另外,不要粗鲁或其他任何事情,但严格来说,我不认为在您的回答中提出问题,这种事情可以算作网站上的高质量回答。 @OrtundSELECT * FROM Users WHERE Username LIKE '%Happy%'
不会返回 Harvey
@Ortund 当然是。您在进行零实验或调查后提出了一个问题,使用 SO 作为基于人类的 REPL。你做了一个错误的假设,问为什么你做了这个假设是完全正确的。【参考方案2】:
documentation from String.Contains
说:
返回一个值,指示指定的子字符串是否出现在此字符串中。
所以整个匹配字符串 (Happy
) 必须与输入字符串 (Happy McHappyFace
) 的全部或部分匹配。它只会匹配Happy
,而不匹配H
或Ha
。
它将转换为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 结果?的主要内容,如果未能解决你的问题,请参考以下文章