2

我有以下查询:

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

我有两种情况我想使用相同的查询。

场景一:

MyParam = "Material1"

期望的结果:

query = "Material1"

意思是m.MaterialID = MyParam匹配和OrElse短路所以m.MaterialID.Contains(MyParam)不执行。

实际结果:

query = "ABC_Material1", "Material1", "XYZ_Material1"

所以出于某种我不明白的原因,Contains正在执行。

场景二:

MyParam = "Material2"

期望的结果:

query = "Material2_J", "Material2_K", "Material2_L"

意思是m.MaterialID = MyParam不匹配,所以m.MaterialID.Contains(MyParam)改为执行。

实际结果:

query = "Material2_J", "Material2_K", "Material2_L"

所以这似乎像我预期的那样工作。

问题:

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

替代方案和解决方法将不胜感激。

4

2 回答 2

1

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

好吧,它不会为那个单独的值执行- 但它为其他条目执行。

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

顺便说一句,鉴于字符串“包含自身”,您的谓词等效于:

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

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

于 2012-08-29T13:38:22.400 回答
1

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

于 2012-08-29T13:41:04.780 回答