实体框架搜索表达式

时间:2012-05-17 08:44:48

标签: entity-framework

我必须通过字段EmployeeId进行搜索。 我还有参数 empId ,可以是这样的:'123' 在我的数据库中有下一个值:

'0123' - what I need 
'10123'
'1234'

等等。 我的目标 - 记录以 empId 结尾并且没有或者有一个或多个前导0。 我试着写这样的东西:

var result = from member in MembersSet
             where SqlMethods.Like(member.EmployeeId, "%" + empId) &&
                   !(SqlMethods.Like(member.EmployeeId, "%[^0]%" + empId))
             select member.Id;

但是我收到了一个错误 LINQ to Entities does not recognize the method 'Boolean Like(System.String, System.String)' method, and this method cannot be translated into a store expression.

可能有解决方法吗?

1 个答案:

答案 0 :(得分:1)

SqlMethods适用于Linq-To-Sql,而非EntityFramework。 EF-SqlFunctions(System.Data.Objects.SqlClient.SqlFunctions)有一个等价物。您可以使用PatIndex功能执行您想要的操作。值得注意的是,这将使您的代码特定于SQL Server。

您可以使用标准的String EndsWith函数在不使用PatIndex的情况下执行初始表达式,该函数将由EF自动翻译。

var result = from member in MembersSet
             where member.Id.EndsWith("123")
                 && SqlFunctions.PatIndex("[^0]%123", member.Id) == 0
             select member.Id;

如果Id的值始终为数字(即使前导零),您可以尝试将它们转换为服务器上的整数,方法是定义一个额外的方法来处理解析为int(EF不会转换为Int32.Parse) - 有关详细信息,请参阅this question