是否可以在 linq to sql 中使用 lambda 表达式?

Is possible to use lambda expression in linq to sql?

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

    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...

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

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

...虽然您的代码示例似乎不清楚这是否真的通用还是仅处理 Preventivos.

重点是您提供的查询表达式会添加一个额外的 "wrapper" 层:

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

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

没有 Expression。如果您的参数只是 Func<T, bool> 那么您可以将 predicate 视为委托:

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

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

您可以先尝试 Compile 将表达式转换为 Func<T, bool>:

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

这将 编译 但当查询提供程序尝试将其转换为 SQL.

时可能仍会在运行时失败

因此,除非您真的不喜欢使用查询语法,否则方法语法会更简洁:

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

为了补充 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