public class BaseEntity
{
public int Id {get;set;}
public DateTime Created {get;set;}
public bool IsDeleted {get;set;}
}
Думаю данные свойства есть почти в каждой сущности, и довольно часто Возникает необходимость получить список за период, т.е. что то типа такого:
var start = new DateTime(2015, 11, 01);
var stop = new DateTime(2015, 11, 30);
var results = context.Entity.Where(x=>x.Created>=start&&x.Created<=stop).ToList()
но довольно часто таких сущностей несколько и плодить по сути однообразный код крайне не хочется, другой пример получить строки где какое то значение равно заданному, т.е. что то типа этого:
var arg = true;
var results = context.Entity.Where(x=>x.IsDeleted==arg).ToList();
и это встречается тоже довольно часто ну и т.д.
т.е. хочется что то типа этого:
var start = new DateTime(2015, 11, 01);
var stop = new DateTime(2015, 11, 30);
var results = context.Entity.Beetwen("Created",start,stop).ToList();
public static class BaseEntityExtensions
{
//где field это имя поля по которому надо фильтровать записи
public static IQueryable
Помогите реализовать метод Beetwen
Ответ
Where метод для IQueryable принимает Expression поэтому его можно собрать самостоятельно
public static IQueryable
var firstCondition = Expression.GreaterThanOrEqual(prop, startExpr); // Param_0.field >= start
var secondCondition = Expression.LessThanOrEqual(prop, stopExpr); // Param_0.field <= stop
var fullExpression = Expression.AndAlso(firstCondition, secondCondition); // Param_0.field >= start && Param_0.field <= stop
var func = Expression.Lambda
return src.Where(func);
}
Методы которые использовались:
Expression.Parameter
Expression.PropertyOrField
Expression.Constant
Expression.GreaterThanOrEqual
Expression.LessThanOrEqual
Expression.AndAlso
Expression.Lambda
Альтернативным подходом может быть использование библиотеки DynamicLinq (есть в NuGet) в ней можно передавать в функции не Expression, а строку
src.Where(string.Format("{0} >= @0 && {0} <= @1", field), start, stop);
По мотивам ответа @Vlad, только используя уже переданное выражение
public static IQueryable
return src.Where(Expression.Lambda
в использовании: var res = query.Beetwen(_ => _.Date, from, to);
И еще вариант, но не такой интересный как предыдущие
public static IQueryable
return src.Where(Expression.Lambda
в использовании: var res = query.Beetwen(_ => _.Date, from, to);
немного обобщенный вариант
public static IQueryable
return src.Where(Expression.Lambda
в использовании: var res = query.Beetwen(_ => _.Date, from, to);
Комментариев нет:
Отправить комментарий