Я написал метод расширения, который выражает выражение на основе условия, но когда условие является groupby, результатом является порядок by !!! что я не так?Динамический GroupBy с использованием выражения в .net-ядре
вот мой метод:
public static IQueryable<T> NewWhere<T, U>(this IQueryable<T> source, string prop, U value, string condition)
{
MethodInfo method;
Expression<Func<T, bool>> lambda = null;
Expression body = null;
string groupSelector = null;
var type = typeof(T);
var parameter = Expression.Parameter(type, "p");
var property = Expression.Property(parameter, prop);
var constant = Expression.Constant(value, typeof(U));
if (condition == "GreaterThan")
body = Expression.GreaterThan(property, constant);
else if (condition == "LessThan")
body = Expression.LessThan(property, constant);
else if (condition == "Equals")
body = Expression.Equal(property, constant);
//For implement sql like command we need them
else if (condition == "StartsWith") {
method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
body = Expression.Call(property, method, constant);
}
else if (condition == "EndsWith")
{
method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });
body = Expression.Call(property, method, constant);
}
else if (condition == "Contains")
{
method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
body = Expression.Call(property, method, constant);
}
//For implement sql like command we need them
//group by only one field
if (condition == "GroupBy")
groupSelector = prop;
else
lambda = Expression.Lambda<Func<T, bool>>(body, new[] { parameter });
//return the grouped by result or not grouped by
if (groupSelector != null)
{
var selectorExp = Expression.Lambda<Func<T, U>>(property, new ParameterExpression[] { parameter });
source = source.GroupBy(selectorExp).SelectMany(g => g);
//source.GroupBy(e => e.GetType().GetProperty(groupSelector)).SelectMany(gr => gr);
}
else
source = source.Where(lambda);
return source;
}
, но когда я запускаю mthod с условием GroupBy, результат:
SELECT [e].[Id], [e].[Year]
FROM [org].[Data] AS [e]
ORDER BY [e].[Year]
я не знаю, почему его произошло?
я получил эту ERRO, является то, что причиной я использовал SelectMany: Не удается неявно преобразовать тип «System.Linq.IQueryable » до «System.Linq.IQueryable», я должен выбрать сгруппированных на всех. selectMany может объединить все данные вместе, правильно? –
data
Тип возврата вашего метода не совпадает с типом возвращаемого выражения 'GroupBy'. Вам придется соответствующим образом изменить тип возврата вашего метода. Это, скорее всего, не изменит ваш SQL-выход. – Sefe
Как изменить тип возвращаемого типа groupby, потому что я не могу изменить тип возвращаемого метода, возвращаемый тип T, U для выражения lambda i, сделанного из свойства, точно до groupby – data