【问题标题】:Linq 2 SQL and custom extension methodLinq 2 SQL 和自定义扩展方法
【发布时间】:2012-09-09 11:29:16
【问题描述】:

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

我有一个关于 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() && ...

没有运气。

我知道我很笨,但请帮帮我

【问题讨论】:

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


    【解决方案1】:

    在 Linq2SQL 中不能这样做(不能翻译成 SQL),必须先转换为 IEnumerable。

    【讨论】:

      【解决方案2】:

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

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

      排序完成后,您将能够调用此方法:

      r.EmailAddress.IsSaneEmail()
      

      【讨论】:

      • 不,还是一样的“无sql翻译”异常。
      • 在这种情况下,我猜您需要使用例如将整个集合检索到内存中。 ToList() 然后过滤它...
      • 是的,这是一个想法,但是大型收藏呢?这将是低效的
      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多