2012-08-03 57 views
0

我想从我的联系人表中返回联系人记录,但只能在联系人电子邮件地址有效的情况下返回。所以像下面这样:Linq to where where子句中的SQL有效电子邮件地址

var contacts = (from cont in db.Contacts 
         where cont.Accounts_CustomerID == accountId 
         && ValidEmail(cont.EmailAddress) 
         select new ContactLight 
         { 
          AccountId = cont.Accounts_CustomerID, 
          FirstName = cont.Firstname, 
          LastName = cont.Lastname, 
          EmailAddress = cont.EmailAddress 
         }); 

private static bool ValidEmail(string email) 
{ 
    if(email == "") 
     return false; 
    else 
     return new System.Text.RegularExpressions.Regex(@"^[\w-\.][email protected]([\w-]+\.)+[\w-]{2,6}$").IsMatch(email); 
} 

我得到“方法'布尔ValidEmail(System.String)'没有支持转换为SQL”。所以我假设一个正则表达式的方法不能被翻译。最好的解决办法是什么?

+0

拉出数据,然后运行validEmail地方上的对象子句在SQL使用 – saj 2012-08-03 10:51:18

+0

的任何事物的地方一样,条款将被编译以某种形式SQL语句组成部分。您编写的自定义正则表达式匹配函数无法转换为SQL。 – Echilon 2012-08-03 10:52:36

回答

3

将您的电子邮件验证移动到客户端(Linq到对象)。

var contacts = db.Contacts 
    .Where(cont.Accounts_CustomerID == accountId) 
    .Select(cont => new ContactLight 
        { 
         AccountId = cont.Accounts_CustomerID, 
         FirstName = cont.Firstname, 
         LastName = cont.Lastname, 
         EmailAddress = cont.EmailAddress 
        }) 
    .AsEnumerable() //this forces request to client side 
    .Where(e => ValidEmail(e.EmailAddress)); 
+0

这个答案非常好,因为你只需要投射你需要的列(而不是整个实体)。 – usr 2012-08-03 10:52:41

+0

谢谢Serg,我喜欢这个主意。我会给它一个测试,看看表现(我有134,000条记录)。 – Grover 2012-08-03 11:04:11