2012-08-29 34 views
1

我有以下查询:在LINQ语句中使用OrElse运算

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

备选方案和解决方法将不胜感激。

+1

对于您的信息:作为'OrElse'的'Or'都被翻译成SQL:'OR'中的同一个东西。但答案中提到的那里并不是什么问题。 – Mew

回答

1

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

那么它不会执行对个别价值 - 但它执行的其他条目。

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

顺便说一句,因为一个字符串“包含本身”你的谓词等同于:

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

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

1

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