【发布时间】:2020-06-21 14:57:18
【问题描述】:
我目前正在开发一个 asp.net web api 2 应用程序。请记住我的经验是 php、js、css 等,而不是 c#。
我希望有人可以帮助我使用使用 Linq 表达式树的通用 IQueryable 扩展。
我有 3 个表(实体框架)。
交易
Id,Name
ProductTrades(链接表)
Id,Trade_Id,Product_Id
产品
Id,Code
我需要从作为变量传递的产品代码列表中返回具有至少一个产品代码的所有交易
我可以很好地使用以下内容
list<string> tocheck = new list<string>("productcode1","productcode2");
var trades = db.Trades.SqlQuery(
"Select * from Trades T " +
"left join ProductTrades PT on T.Id = PT.Trade_Id " +
"left join Products P on PT.Product_Id = P.Id " +
"where P.Code in (@prod)", new SqlParameter("@prod", String.Join(",", tocheck))).ToList();
但是我想使用 Linq 表达式树来实现它以使其通用
以下是我的尝试(我在尝试学习时使用多个资源将其放在一起)
public static IQueryable<T> FilterWhereItemIn<T>(this IQueryable<T> queryable, string propertyOrFieldName, List<string> values)
{
var elementType = typeof(T);
var parameterExpression = Expression.Parameter(elementType);
var propertyOrFieldExpression = propertyOrFieldName.Split('.').Aggregate((Expression)parameterExpression, Expression.PropertyOrField);
var method = typeof(List<string>).GetMethod("Contains", new Type[] { typeof(string) });
var someValue = Expression.Constant(values, typeof(List<string>));
var containsExpression = Expression.Call(propertyOrFieldExpression, method, someValue);
var selector = Expression.Lambda<Func<T, bool>>(containsExpression, parameterExpression);
return queryable.Where(selector);
}
我用以下方式调用它(IQueryable queryable 是 Trade 类型)
list<string> tocheck = new list<string>("productcode1","productcode2");
queryable.FilterWhereItemIn("Products.Code", tocheck );
但是,我收到“代码”不存在的错误消息。我认为这是因为 Products 是一个集合。有谁知道如何实现这一点。
(抱歉这篇文章有点仓促)
【问题讨论】:
标签: entity-framework asp.net-web-api2 iqueryable linq-expressions