У меня ранее были следующие настройки:
public static bool BlogIsLive(BlogPost b)
{
return b.Status == (int)ItemStatus.Active && b.PublishDate < DateTime.Now ;
}
/// Database query
var blogs = (from b in db.BlogPost
where BlogIsLive(b) // <--- super useful, used in multiple places
select b
).ToList()
Но после обновления до EF Core 3.0 выдает следующую ошибку
/// The LINQ expression ... could not be translated. Either rewrite the query in a form
/// that can be translated, or switch to client evaluation explicitly by inserting a
/// call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().
Я понимаю, что это часть взломаИзменения в EF Core 3.0
Теперь мне нужно написать запрос вручную во всех местах, где раньше был BlogsIsLive()
.
var blogs = from b in db.BlogPost
where b.Status == (int)ItemStatus.Active //<--- Annoying repetition of code
&& b.PublishDate < DateTime.Now //<---
select b
Это очень раздражает. Нет ли способа, которым я могу написать метод, который вставляет туда?
Я знаю, что в EF есть DbFunctions, которые, например, могут упростить процесс сравнения Date
значений, поэтому я не вижу причин, по которым было бы невозможно написать что-то свое, что делает подобное с участием Int
, string
или bool
.
Что-то вроде:
public static DbFunction BlogIsLive(BlogPost b)
{
//Example
return DbFunction(b.Status == (int)ItemStatus.Active && b.PublishDate < DateTime.Now);
}
/// Database query
var blogs = (from b in db.BlogPost
where MyDbFunctions.BlogIsLive(b)
select b
).ToList();
Я пробовал несколько вариантов выше, но не повезло.
Спасибо.