【问题标题】:Is possible to use lambda expression in linq to sql?是否可以在 linq to sql 中使用 lambda 表达式?
【发布时间】:2015-05-07 13:56:04
【问题描述】:

我想知道你是否可以这样做:

    public List<T> FindOrder<T>(Expression<Func<T, bool>> predicate) where T : class
    {
        DbSet<Preventivos> preventivos = this.Preventivos;

        return (from p in preventivos
                where predicate
                select new...

【问题讨论】:

  • 当然是preventivos.Where(predicate).Select(e =&gt; new ...)

标签: c# linq linq-to-sql lambda


【解决方案1】:

不是那样,不——但你可以写:

return preventivos.Where(predicate).Select(...);

...尽管您的代码示例似乎不清楚这是否真的是通用的,或者它是否只处理Preventivos

关键是您提供的查询表达式会添加一个额外的“包装”层:

return preventivos.Where(p => predicate)
                  .Select(p => new { ... });

...而您想将谓词表达式树直接传递给Where调用。

【讨论】:

  • 但是,这样不行吗? from p in preventivos where predicate select new
  • @EleazarCelis 他已经回答了这个问题。前半句就对了。
【解决方案2】:

不适用于Expression。如果您的参数只是 Func&lt;T, bool&gt;,那么您可以将 predicate 视为委托:

     return (from p in preventivos
            where predicate(p)
            select new ...

当提供程序尝试转换为 SQL 时,这可能会失败,因为它需要具有 Expression 的元数据才能生成等效的 SQL。

您可以先尝试Compile 表达式将其转换为Func&lt;T, bool&gt;

    return (from p in preventivos
            where predicate.Compile()(p)
            select new ...

这将编译,但当查询提供程序尝试将其转换为 SQL 时,可能仍会在运行时失败。

所以除非你真的沉迷于使用查询语法,否则方法语法会更简洁:

return preventivos.Where(predicate)
                  .Select(p => new ...);

【讨论】:

    【解决方案3】:

    为了补充 Jon 的回答,这里有一些实际工作代码的选择(正在使用 @ www.NJtheater.com),让您可以通过 ID# 或名称查看场地

        public void Display(int id)
        {
            Display(ven => ven.VenueID == id);
        }
    
        public void Display(string name)
        {
            Display(ven => ven.Shortname == name);
        }
    
        public void Display(Expression<Func<Venue, bool>> whereClause)
        {
            Venue venue = db.Venues.Where(whereClause).FirstOrDefault();
    
               /// etc
    

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      相关资源
      最近更新 更多