使用LINQ Contains与SqlMethods.Like

时间:2010-01-29 21:57:44

标签: asp.net vb.net linq

如何在不调用辅助库System.data.Linq.SqlClient的情况下在LINQ查询中复制以下结果?

Where SqlMethods.Like(e.POSITION, "%A[FGL]7%") _

如果可能的话,我希望这个查询更纯粹是LINQ。

4 个答案:

答案 0 :(得分:9)

编辑:根据我对Lette的评论,我最初错过了SqlMethods.Like支持的模式匹配。

您的查询看起来像VB,因此您实际上可以直接使用Like operator,但您需要将%替换为星号*

Where e.POSITION Like "*A[FGL]7*" _

如果您正在使用C#,则需要在调用AsEnumerable()后使用Lette's suggestion将数据存入内存(可能首先按然后过滤任何其他条件调用正则表达式进行进一步过滤)或遵循Ruben's suggestion

我提到的方法不像SqlMethods.Like方法那样100%,因为模式基本上是转义的。换句话说,它只将其视为文字文本。

<小时/> 只需使用常规的String.Contains方法:

Where e.POSITION.Contains("A[FGL]7")

LINQ to SQL将以这种方式转换.NET方法:

  • text。 StartsWith(...) = LIKE ...%
  • text。包含(...) = LIKE %...%
  • text。 EndsWith(...) = LIKE %...

答案 1 :(得分:1)

澄清:这个答案的编写假设这是 LINQ to SQL问题。如果是,请转到其他答案。

为此,您必须模仿SQL中的Like运算符。在您的情况下,这可能最好用正则表达式完成。

以下是一个例子:

using System.Text.RegularExpressions;

...

Regex regex = new Regex("^.*A[FGL]7.*$");

// assuming that 'e' is a sequence of elements of type Foo
IEnumerable<Foo> results = e.Where(foo => regex.IsMatch(foo.POSITION));

现在应根据您的需要过滤results

答案 2 :(得分:1)

大多数LINQ提供程序都支持VB Like运算符,它几乎完全相同。从C#开始,您可以通过 Microsoft.VisualBasic.CompilerServices.LikeOperator LikeString 方法访问此功能:

using Microsoft.VisualBasic;
using Microsoft.VisualBasic.CompilerServices;

...

where LikeOperator.LikeString(e.POSITION, "*A[FGL]7*", CompareMethod.Text)

请注意VB的Like使用的语法与SQL的略有不同;值得注意的是,它使用*?而不是%_。 (但LINQ to SQL将此VB语法转换为SQL语法。)

(不要忘记参考 Microsoft.VisualBasic.dll 。)

答案 3 :(得分:0)

考虑这样的会员资料信息:

matches = matches.Union(memberDB.aspnet_Profile
                    .Where("it.PropertyValuesString Like @first", new ObjectParameter("first", "%<FirstName>%" + firstName + "%</FirstName>%"))
                    .Select(p => p.UserId));