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 我认为运算符(WhereAny 等)并不重要,但它是***运算符还是 lambda 表达式的一部分。当您意识到在像c =&gt; c.Accounts.AsQueryable().Any(this.AccountSecurity(p_UserKey)) 这样的lambda 表达式(Expression&lt;Func&lt;…&gt;&gt;)中,实际上没有执行主体(在=&gt; 之后)时,这并不奇怪。而IQueryable的译者通常不会处理未知方法。

以上是关于c# linq语句的Expression<Func<TEntity,bool>>怎么传进参数的主要内容,如果未能解决你的问题,请参考以下文章

c# linq 动态多条件查询语句的写法

了解C#的Expression

C# Expression Visitor

c# ef框架怎么使用linq语句多表查询?

如何在 C# 中创建 Linq AND 表达式? [复制]

C# 如何在另一个 Linq 语句中的 XmlAttributeCollection 上使用 Linq?