Я сейчас работаю над приложением asp. net web api 2. Пожалуйста, помните, мой опыт в php, js, css и так далее, а не c#.
Я надеюсь, что кто-то может помочь мне с моим универсальным расширением IQueryable, которое использует дерево выражений Linq.
У меня есть 3 таблицы (Entity Framework).
Сделки
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 для достижения этого, чтобы сделать его обобщенным c
См. Ниже мою попытку (я собрал это, используя несколько источников, пытаясь изучить его)
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 запрашиваемый тип торговли)
list<string> tocheck = new list<string>("productcode1","productcode2");
queryable.FilterWhereItemIn("Products.Code", tocheck );
Однако я получаю сообщение об ошибке, что «Код» не существует. Я предполагаю, что это потому, что Продукция - это коллекция. Кто-нибудь знает, как этого добиться.
(PS Извините, этот пост был немного срочно)