2017-04-14 56 views
0

我正在使用LINQ to Entities从SQL中选择数据。LINQ Store表达式中不支持的方法

这里是我的发言

var employee = from p in _context.employee 
         select p; 

employee = employee.Where(p => 
Helper.RemoveSpecialCharacters(p.IdentificationNumber). 
Equals(Helper.RemoveSpecialCharacters(search.IdentificationNumber))); 

var Results = employee.ToList(); 

我使用RemoveSpecialCharacters方法,我写信给两侧对比无特殊字符进行比较。

这里我得到错误,Linq-> Entity不支持“RemoveSpecialCharacters”方法,它不是有效的存储表达式。

我知道它不能被翻译成SQL。但是,如何使用LINQ进行这种比较?

RemoveSpecialCharacters方法

public static string RemoveSpecialCharacters(string str) 
    { 
     char[] arr = str.Where(c => (char.IsLetterOrDigit(c))).ToArray(); 

     str = new string(arr); 

     return str; 
    } 

我怎样才能把这个LINQ让SQL理解,如果方法名被转换为LINQ店那么也许。

+1

顺便说一句,var employee = from _context.employee select p;'被翻译成var employee =(_context.employee);'(C#语言规范版本5.0,7.16.2.5选择子句) 。 – Philippe

+0

理想情况下,您应该能够创建一个MethodCall表达式,为您的IQueryable查询工作,它只是无法翻译方法,从'Expression Tree'编译'Func'时 –

+0

使用'Regex.Replace'检出代码 –

回答

2

如果你可以表达你的SQL RemoveSpecialCharacters,你可以有一个计算IdentificationNumberWithoutSpecialCharacters柱呈现你的员工一个SQL视图,然后在其上进行筛选。

您还可以通过为SQL Server创建.NET程序集来重用该方法的C#实现。

+0

如何在Sql中表示'RemoveSpecialCharacters',你应该已经回答了这个部分,随着数据大小的增加,Sql CLR或者动态Sql不是性能的好选择。没有代码,这应该是比回答更多的评论 –

0

.ToList()完成了你最初的数据库查询,并给你一个 内存中表示继续努力,修改你的对象。

var employee = from p in _context.employee 
         select p.ToList(); 
string searchIdent = Helper.RemoveSpecialCharacters(search.IdentificationNumber); 

employee = employee.Where(p => 
Helper.RemoveSpecialCharacters(p.IdentificationNumber). 
Equals(searchIdent)); 

var Results = employee; 
+4

这将在过滤之前将整个员工表拉入内存。 – Philippe

+0

是的,不是我想要做的事情。 –

+1

即使拉整个表是唯一的解决方案,我会用'.AsEnumerable()替换'.ToList()',以避免创建列表并在内存中保留被丢弃的对象。 – Philippe

0

使用Regex.Replace考虑,大多会被你所使用的Linq to Entities提供商转化为正确的表达,目前的代码有问题,因为可查询的提供者不知道如何方法调用转换为查询表达式,对LINQ

要求

正则表达式

Regex regex = new Regex("[^a-zA-Z0-9]");

修改代码

var employee = from p in _context.employee select p; 

employee = employee.Where(p => 
regex.Replace(p.IdentificationNumber,""). 
Equals(regex.Replace(search.IdentificationNumber,""))); 

var Results = employee.ToList();