Linq 2 SQL和自定义扩展方法

时间:2012-09-17 09:00:45

标签: asp.net linq-to-sql extension-methods

在构建我的应用程序时,我陷入了一个愚蠢的步骤。

我对linq 2 sql有一个简单的查询:

var recipients = cdc.Recipients.Where(r => r.Owner == Sanitize.SanitizeUserName(context.User.Identity.Name) && r.Enabled == true && (r.DisplayName.Contains(qs) || r.EmailAddress.Contains(qs)))
                                        .Select(r => new NVC { name = r.DisplayName, value = r.EmailAddress }).ToList();

将一些数据带到收件人的表中并放入自定义类。一切顺利。

我需要在where子句中添加一个额外的过滤器,以检查电子邮件地址是否有效。

我尝试使用一个简单的函数,但在使用时它抛出了“无sql翻译”异常。

通过互联网挖掘我发现我必须使用扩展方法,所以我最终建立了这个:

public static Expression<Func<string, bool>> IsSaneEmail = y => (!string.IsNullOrEmpty(y) && Regex.IsMatch(y, emailPattern));

(其中emailPattern是正则表达式字符串)

但是如何申请我的查询?我试图添加where子句

... && IsSaneEmail(r.emailAddress) && ...

... && r.EmailAddress.IsSaneEmail() && ...
没有运气。

我知道我很蠢,但帮助我

2 个答案:

答案 0 :(得分:1)

你不能在Linq2SQL中做到这一点(不能被翻译成SQL)你必须先转换为IEnumerable。

答案 1 :(得分:0)

你的扩展方法需要以字符串类为目标,它应该返回bool:

public static bool IsSaneEmail(this string val) {
        return !string.IsNullOrEmpty(val) && Regex.IsMatch(val, emailPattern)
    }

一旦对其进行了排序,您就可以这样调用此方法:

r.EmailAddress.IsSaneEmail()