是否可以在 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
我想知道你是否可以做这样的事情:
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