Похоже, вы используете VB.NET. Я прошу прощения за ответ с некоторым кодом C #, но, надеюсь, вы сможете перевести.
Я могу придумать пару способов справиться с этим. Первая идея заключается в создании функции, которая возвращает предикат типа Func. Это позволяет EF преобразовать предикат в запрос. Например:
static Func<MemberShip, bool> IsActiveMember()
{
return m => (
(m.IsCancelled == 0) &&
(m.StartDate < DateTime.Now) &&
(m.ExpirationDate > DateTime.Now));
}
Большим недостатком этого подхода является то, что вы не можете использовать синтаксис «запрос на понимание» (откуда ... выберите ...). Вы должны использовать методы LINQ напрямую, как в:
var context = new AppEntities();
var activeMembers = context.MemberShipSet.Where(IsActiveMember());
В зависимости от того, как вам нужно его использовать, лучшим подходом может быть создание функции или свойства, которое возвращает набор предварительно отфильтрованных элементов MemberShip, включающих только «активные». Вот пример расширения класса контекста, созданного конструктором EF, с помощью такого свойства:
partial class AppEntities
{
public IQueryable<MemberShip> ActiveMembers
{
get
{
return
from m in this.MemberShipSet
where (
(m.IsCancelled == 0) &&
(m.StartDate < DateTime.Now) &&
(m.ExpirationDate > DateTime.Now))
select m;
}
}
}
Отличительной особенностью этого подхода является то, что вы можете формулировать запросы LINQ к ActiveMembers. Например:
var lastThirty = DateTime.Now.AddDays(-30);
var context = new AppEntities();
var recentActiveMembers =
from mr in context.ActiveMembers
where (mr.StartDate > lastThirty)
select mr;