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他已经回答了那个问题。它在前半句中是正确的。