如何在不调用辅助库System.data.Linq.SqlClient的情况下在LINQ查询中复制以下结果?
Where SqlMethods.Like(e.POSITION, "%A[FGL]7%") _
如果可能的话,我希望这个查询更纯粹是LINQ。
答案 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方法:
LIKE ...%
LIKE %...%
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));