Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以在linq to sql中使用lambda表达式吗?_C#_Linq_Linq To Sql_Lambda - Fatal编程技术网

C# 可以在linq to sql中使用lambda表达式吗?

C# 可以在linq to sql中使用lambda表达式吗?,c#,linq,linq-to-sql,lambda,C#,Linq,Linq To Sql,Lambda,我想知道你是否可以这样做: public List<T> FindOrder<T>(Expression<Func<T, bool>> predicate) where T : class { DbSet<Preventivos> preventivos = this.Preventivos; return (from p in preventivos w

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

    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

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

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

。。。然而,您希望将谓词表达式树直接传递给Where调用。

不是这样,否-但是您可以编写:

。。。虽然您的代码示例似乎不清楚这是真正的泛型还是只处理Preventivos

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

return preventivos.Where(p => predicate)
                  .Select(p => new { ... });
。。。而您希望将谓词表达式树直接传递给Where调用。

不使用表达式。如果您的参数只是一个Func,则可以将谓词视为委托:

     return (from p in preventivos
            where predicate(p)
            select new ...
当提供程序尝试转换为SQL时,这可能会失败,因为它需要表达式的元数据来生成等效的SQL

您可以尝试先编译表达式以将其转换为Func:

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

因此,除非您真的对使用查询语法很感兴趣,否则方法语法会更简洁:

return preventivos.Where(predicate)
                  .Select(p => new ...);
没有表情。如果您的参数只是一个Func,则可以将谓词视为委托:

     return (from p in preventivos
            where predicate(p)
            select new ...
当提供程序尝试转换为SQL时,这可能会失败,因为它需要表达式的元数据来生成等效的SQL

您可以尝试先编译表达式以将其转换为Func:

它将编译,但在运行时当查询提供程序尝试将其转换为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

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

当然preventivos.Wherepredicate.Selecte=>new…当然preventivos.Wherepredicate.Selecte=>new…但是,这样不行吗?从preventivos中的p选择谓词new@EleazarCelis他已经回答了那个问题。前半句是对的。但是,这样不行吗?从preventivos中的p选择谓词new@EleazarCelis他已经回答了那个问题。它在前半句中是正确的。