我有以下查询:
Dim query = From m In Me.DataWorkspace.Products_dbData.MaterialList _
Where m.ProductModel = Me.lblMyModel _
And ((m.MaterialID = MyParam) OrElse (m.MaterialID.Contains(MyParam))) _
Select m _
Order By m.SortNumber
我的数据摘录如下:
ProductModel MaterialID SortNumber
------------ ------------- ----------
111 ABC_Material1 NULL
111 Material1 0
111 XYZ_Material1 0
111 Material2_J 0
111 Material2_K 1
111 Material2_L 2
我有两种情况,我想使用相同的查询。
情景1:
MyParam = "Material1"
期望的结果:
query = "Material1"
意味着m.MaterialID = MyParam
匹配且OrElse
短路,因此m.MaterialID.Contains(MyParam)
不会执行。
实际结果:
query = "ABC_Material1", "Material1", "XYZ_Material1"
因此,由于某些原因我不明白,Contains
正在执行。
情景2:
MyParam = "Material2"
期望的结果:
query = "Material2_J", "Material2_K", "Material2_L"
意味着m.MaterialID = MyParam
不匹配,因此执行m.MaterialID.Contains(MyParam)
。
实际结果:
query = "Material2_J", "Material2_K", "Material2_L"
所以这看起来像我期望的那样有效。
问题:
为什么这不按我期望的方式工作?我究竟做错了什么?我很确定我误解了OrElse
运算符的功能,但我似乎无法找到对我有意义的解释。
非常感谢替代方案和解决方法。
答案 0 :(得分:1)
意思是m.MaterialID = MyParam匹配且OrElse短路,因此m.MaterialID.Contains(MyParam)不执行。
嗯,它不会为单个值执行 - 但将执行其他条目。
您必须记住的是,您的谓词适用于每个结果。是否已完全匹配是完全不可见的,与谓词的后续应用无关。
顺便说一句,假设字符串“包含自身”,则谓词相当于:
Where m.ProductModel = Me.lblMyModel And m.MaterialID.Contains(MyParam)
听起来你真的想做两个查询:一个完全匹配查询,然后(如果没有找到任何结果)部分匹配查询。
答案 1 :(得分:1)
您正确理解OrElse
,但不了解LINQ查询的工作方式
对每一行执行条件,与前一行的结果无关。