在构建我的应用程序时,我陷入了一个愚蠢的步骤。
我对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() && ...
没有运气。
我知道我很蠢,但帮助我
答案 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()