Я хочу получить следующее выражение или как можно ближе к нему.
IRangePredicate range = new Range();
DbContext context = new dbModel();
context.Table1.Where(x => range.IsInRange(x.CreatedAt) && x.type == 1).ToList();
и range создаст частичное выражение для запроса linq, которое может быть разрешено как:
CreatedAt >= from && CreatedAt <= to
Или
CreatedAt >= from
Или
CreatedAt <= To
для использования в запросе linq.
В конце концов, я хотел бы расширить этот метод, включив в него также возможности «меньше или больше» без равных.
и использовать его как своего рода «внедрение зависимости аргумента».Однако мои попытки даже не компилируются, поскольку Expression<Func<DateTime, bool>>
нельзя использовать как частичный параметр, и мне нужно определить следующий запрос для этих специальных фильтров.Что я не хочу делать.Я хочу, чтобы он читался как «обычный» Linq.
Или мне нужно просто вставить их как Func.Это может сработать, но как только я попытаюсь сделать это в Context Linq Query, эта вещь взорвется, потому что Entity Framework не будет работать хорошо, если она не отформатирована как выражение
Может ли кто-нибудь помочь мне вправильное направление?
Пример того, что я пытался: (Обратите внимание, что это не компилируется, потому что это моя проблема: D)
РЕДАКТИРОВАТЬ Отсюда: -Я закомментировал строкукода, который не компилируется, поэтому у вас есть скомпилированный пример.Это просто не работает, если вы пытаетесь сделать это на наборе DbContext.
public interface IRangeFunctional
{
bool GetRange(DateTime param);
}
public interface IRange
{
Expression<Func<DateTime, bool>> GetRange(DateTime param);
}
public class RangeFunctional : IRangeFunctional
{
private DateTime _from;
private DateTime _to;
public RangeFunctional(DateTime from, DateTime to)
{
_from = from;
_to = to;
}
public bool GetRange(DateTime param)
{
return param >= _from && param <= _to;
}
}
public class Range : IRange
{
private DateTime _from;
private DateTime _to;
public Range(DateTime from, DateTime to)
{
_from = from;
_to = to;
}
public Expression<Func<DateTime, bool>> GetRange(DateTime param)
{
return (x => param >= _from && param <= _to);
}
}
public class Invoice
{
public DateTime CreatedAt { get; set; }
public int typeId { get; set; }
}
[TestClass]
public class TestRange
{
List<Invoice> list = new List<Invoice>()
{
new Invoice()
{
CreatedAt = new DateTime(2018,1,1,0,0,0), typeId = 1
},
new Invoice()
{
CreatedAt = new DateTime(2018,1,2,0,0,0), typeId = 1
},
new Invoice()
{
CreatedAt = new DateTime(2018,1,1,0,0,0), typeId = 2
},
new Invoice()
{
CreatedAt = new DateTime(2018,1,2,0,0,0), typeId = 2
}
};
[TestMethod]
public void RangeTest()
{
Range r = new Range(new DateTime(2018, 1, 1, 0, 0, 0), new DateTime(2018, 1, 2, 0, 0, 0));
RangeFunctional rf = new RangeFunctional(new DateTime(2018, 1, 1, 0, 0, 0), new DateTime(2018, 1, 2, 0, 0, 0));
List<Invoice> partialListFunc = list.Where(x => x.typeId == 2 && rf.GetRange(x.CreatedAt)).ToList();
//List<Invoice> partialList = list.Where(x => x.typeId == 2 && r.GetRange(x.CreatedAt)).ToList();
Assert.AreEqual(2, partialListFunc.Count);
}
}
Хорошо, поэтому я добавил базовый метод, который подает мне идею, в качестве демонстрационного примера, где я просто используюобычный "bool" для выполнения чистого поиска по ссылке в общих коллекциях.
Однако я хочу повторно использовать эту логику, или настолько близко, насколько это возможно, чтобы позволить мне выполнить это в отношении DbContext.
У меня есть базовый контроллер crud для любого типа таблицы в направленииDb, однако, я хотел бы улучшить этот бит, но позволить программисту реализовать шаблон стратегии для частичных классов, сгенерированных либо из кода сначала, либо из db первых моделей в C #.
Однако, чтобы перевести Linq в SQL, мне нужно преобразовать мой тип возврата "просто bool" в выражения.Я получил это далеко.Но как, черт возьми, я делаю «подмножества» предикатов, которые могут быть объединены в одной коллекции?Я вижу несколько примеров кода, которые требуют от вас цепочки запросов.И это может в конечном итоге стать решением.Это только кажется таким ... ужасным.
Я просто не могу заставить свой мозг придумать синтаксис для этого.И это расстраивает меня: D Прости меня, если этого нельзя сделать, потому что я просто глупый.Мне просто кажется, что это возможно.