Vb.net 在LINQ语句中使用OrElse

Vb.net 在LINQ语句中使用OrElse,vb.net,linq,Vb.net,Linq,我有以下疑问: Dim query=来自Me.DataWorkspace.Products\u dbData.MaterialList中的m_ 其中m.ProductModel=Me.lblMyModel_ 和((m.MaterialID=MyParam)或(m.MaterialID.Contains(MyParam)))_ 选择m_ 索特先生订购 我的数据摘录如下: ProductModel MaterialID SortNumber ------------ --------

我有以下疑问:

Dim query=来自Me.DataWorkspace.Products\u dbData.MaterialList中的m_
其中m.ProductModel=Me.lblMyModel_
和((m.MaterialID=MyParam)或(m.MaterialID.Contains(MyParam)))_
选择m_
索特先生订购
我的数据摘录如下:

ProductModel MaterialID SortNumber
------------        -------------        ----------
111 ABC_材料1空
111材料1 0
111 XYZ_材料1 0
111材料2_J 0
111材料2_K 1
111材料2_L 2
我有两个场景要使用相同的查询

场景1:

MyParam=“Material1”

预期结果:

query=“Material1”

这意味着
m.MaterialID=MyParam
匹配且
OrElse
短路,因此
m.MaterialID.Contains(MyParam)
不执行

实际结果:

query=“ABC\U Material1”、“Material1”、“XYZ\U Material1”

因此,出于某种原因,我不明白,
包含的
正在执行

场景2:

MyParam=“Material2”

预期结果:

query=“Material2\u J”、“Material2\u K”、“Material2\u L”

这意味着
m.MaterialID=MyParam
不匹配,因此执行
m.MaterialID.Contains(MyParam)

实际结果:

query=“Material2\u J”、“Material2\u K”、“Material2\u L”

所以这似乎和我预期的一样有效

问题:

为什么这不是我期望的那样?我做错了什么?我很确定我误解了
OrElse
操作符的功能,但我似乎找不到对我有意义的解释

如有其他选择和解决办法,将不胜感激

这意味着m.MaterialID=MyParam匹配且OrElse短路,因此m.MaterialID.Contains(MyParam)不执行

它不会对单个值执行,但会对其他条目执行

你要记住的是,你的谓词应用于每个结果。是否已经存在精确匹配是完全不可见的,与谓词的后续应用程序无关

另一方面,假设字符串“包含自身”,则谓词等价于:

Where m.ProductModel = Me.lblMyModel And m.MaterialID.Contains(MyParam)

听起来你真的想做两个查询:一个精确匹配查询,然后(如果没有找到任何结果)一个部分匹配查询。

你正确理解了
OrElse
,但不是LINQ查询的工作方式。

对每一行执行该条件,与前一行的结果无关。

请参考:在SQL中,
作为
被转换为相同的内容:
。但这并不是答案中提到的问题所在。