在LINQ语句中使用OrElse

时间:2012-08-29 13:36:07

标签: vb.net linq

我有以下查询:

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运算符的功能,但我似乎无法找到对我有意义的解释。

非常感谢替代方案和解决方法。

2 个答案:

答案 0 :(得分:1)

  

意思是m.MaterialID = MyParam匹配且OrElse短路,因此m.MaterialID.Contains(MyParam)不执行。

嗯,它不会为单个值执行 - 但执行其他条目。

您必须记住的是,您的谓词适用于每个结果。是否已完全匹配是完全不可见的,与谓词的后续应用无关。

顺便说一句,假设字符串“包含自身”,则谓词相当于:

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

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

答案 1 :(得分:1)

您正确理解OrElse,但不了解LINQ查询的工作方式 对每一行执行条件,与前一行的结果无关。