c# linq语句的Expression<Func<TEntity,bool>>怎么传进参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# linq语句的Expression<Func<TEntity,bool>>怎么传进参数相关的知识,希望对你有一定的参考价值。
如图代码,我想实现参数selector传进来实现where 查询,但是不清楚这个参数怎么写,毕竟有and,有or,有like等等,非常繁琐,而且对象我目前也不确定是什么对象,所以想请教各位关于EF框架的linq动态表达式该怎么写?
使用泛型,你的方法签名应该声明为:
void Delete<TEntity>(Expression<Func<TEntity, bool>> selector);追问大哥,你抄完我的代码过来干嘛?我问的是我该怎么实现把selector传进来,实现where语句?这本身就是个参数,也就是怎么给这个参数赋值?
参考技术A 可以传labmda表达式 比如实体tb_UserInfo u=>u.Name !=null &&u.Message等等 最终表达式返回bool值 参考技术B public static Expression<Func<T, bool>> AndAlso<T>(this Expression<Func<T, bool>> expr1,Expression<Func<T, bool>> expr2)var parameter = Expression.Parameter(typeof(T));
var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter);
var left = leftVisitor.Visit(expr1.Body);
var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);
var right = rightVisitor.Visit(expr2.Body);
return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(left, right), parameter);
private class ReplaceExpressionVisitor : ExpressionVisitor
private readonly Expression _oldValue;
private readonly Expression _newValue;
public ReplaceExpressionVisitor(Expression oldValue, Expression newValue)
_oldValue = oldValue;
_newValue = newValue;
public override Expression Visit(Expression node)
if (node == _oldValue)
return _newValue;
return base.Visit(node);
System.Core 错误:使用 C# Entity Framework 和 Linq 和 Expression 的“代码应该无法访问”
【中文标题】System.Core 错误:使用 C# Entity Framework 和 Linq 和 Expression 的“代码应该无法访问”【英文标题】:System.Core error: "Code supposed to be unreachable" using C# Entity Framework and Linq with Expression 【发布时间】:2018-04-14 04:45:08 【问题描述】:在执行以下 Linq to Sql 语句时,我收到“代码应该无法访问”错误。我正在使用 EF 6.1.3。我认为这是一个与过滤导航属性相关的已知错误。似乎它可能已在 EF7 中修复,但我在 EF 6.2 发行说明和 GitHub 上的 EF6 开放项目中没有看到任何与此相关的内容,所以我想我正在寻找解决方法,也许是另一种写作方式我的 Linq 声明。
最终,我在多个地方应用了相同的 where 子句 (AccountSecurity)(也基于传递用户密钥参数),所以我认为我可以将其转换为生成要在我的 Linq to Sql 语句中的 where 子句。
public List<Company> GetCompanyList(int p_UserKey, MemberType p_MemberType)
var qry = from cs in this.DbContext.CompanySet
.Where(c => c.Accounts.AsQueryable().Any(this.AccountSecurity(p_UserKey)))
select cs;
return qry.ToList();
private Expression<Func<Account, bool>> AccountSecurity(int p_UserKey)
return (ac => ac.UserAccounts.Any(ua => ua.UserKey == p_UserKey));
【问题讨论】:
【参考方案1】:作为一种解决方法,您可以将方法调用捕获到查询表达式树之外的变量中,并在内部使用该变量:
var accountFilter = this.AccountSecurity(p_UserKey);
var qry = from cs in this.DbContext.CompanySet
.Where(c => c.Accounts.AsQueryable().Any(accountFilter))
select cs;
return qry.ToList();
【讨论】:
这并不能解决我的问题。同样的错误。感谢您的贡献。 EF 是 EF。这对我有用,但我在 Where 和 Select 中使用了表达式,所以我必须在这两个地方替换它才能工作。 令我惊讶的是,首先使用变量就可以了!非常感谢! 谢谢,它对任何方法都有帮助,但对于 Where 不需要。奇怪的效果。 @VikciaR 我认为运算符(Where
、Any
等)并不重要,但它是***运算符还是 lambda 表达式的一部分。当您意识到在像c => c.Accounts.AsQueryable().Any(this.AccountSecurity(p_UserKey))
这样的lambda 表达式(Expression<Func<…>>
)中,实际上没有执行主体(在=>
之后)时,这并不奇怪。而IQueryable
的译者通常不会处理未知方法。以上是关于c# linq语句的Expression<Func<TEntity,bool>>怎么传进参数的主要内容,如果未能解决你的问题,请参考以下文章