.NET Core 6自定义Expression类无法调用框架Parameter/Property方法
问题根源
你的自定义类命名为Expression,与.NET框架的System.Linq.Expressions.Expression静态类重名。编译器会优先将代码中的Expression解析为你自己的类,而非框架提供的静态类,因此找不到Parameter、Property这些静态方法。
解决方案
提供三种可行方案,按需选择:
1. 使用完整命名空间限定调用框架类
直接在调用时指定框架Expression类的完整命名空间,明确告诉编译器要调用的是框架方法:
public override Expression<Func<Company, bool>> GetExpression(DzbcDbContext context, string name) { // 目标查询:_dzbcDbContext.CompanyProfiles.Where(c => c.Name.Contains(name)); var cParameter = System.Linq.Expressions.Expression.Parameter(typeof(Company), "c"); var cCompanyNameProperty = System.Linq.Expressions.Expression.Property(cParameter, "Name"); // 补充构建完整的Contains调用与Lambda表达式 var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) }); var nameConstant = System.Linq.Expressions.Expression.Constant(name); var containsCall = System.Linq.Expressions.Expression.Call(cCompanyNameProperty, containsMethod, nameConstant); return System.Linq.Expressions.Expression.Lambda<Func<Company, bool>>(containsCall, cParameter); }
2. 给框架类添加别名简化调用
在文件顶部的using语句中给框架的Expression类设置别名,后续代码用别名代替,避免重复写长命名空间:
// 顶部添加别名 using LinqExpr = System.Linq.Expressions.Expression; // ... 其他using语句和类定义 public override Expression<Func<Company, bool>> GetExpression(DzbcDbContext context, string name) { var cParameter = LinqExpr.Parameter(typeof(Company), "c"); var cCompanyNameProperty = LinqExpr.Property(cParameter, "Name"); var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) }); var nameConstant = LinqExpr.Constant(name); var containsCall = LinqExpr.Call(cCompanyNameProperty, containsMethod, nameConstant); return LinqExpr.Lambda<Func<Company, bool>>(containsCall, cParameter); }
3. 重命名自定义类(推荐长期维护)
直接修改自定义类的名称,从根源上避免命名冲突,比如改为CompanyExpressionBuilder:
namespace DZBC.Infrastructure.Expression { public partial class CompanyExpressionBuilder : ExpressionBase<CompanyReadDTO> { // ... 原有方法逻辑保持不变,仅类名修改 } }
内容的提问来源于stack exchange,提问作者miatochai
相关产品推荐
相关产品推荐

