Страсти по делегатам
Всем привет, особенно староверам, стирающим бельё в проруби.
В общем задача на Entity Framework. Как динамично передавать фильтры в запросы, мы уже проходили в прошлой ветке.
Теперь хотеся запрещеночки - передавать условия, связанные с другими Entities.
Но что-то не пойму как.
то есть запрос должен получится примерно такой
Select * from Person P
where exists (
select 1 from Event E
where E.name = P.Name
)
Никогда подобное еще не интересовало.
Но вроде пользуются только двумя вариантами: Expression trees и Dynamic LINQ library
https://www.bytehide.com/blog/dynamic-linq-query-csharp
Вот может быть интересная реализация
https://blog.jeremylikness.com/blog/dynamically-build-linq...
Вот может быть интересная реализация
https://blog.jeremylikness.com/blog/dynamically-build-linq...
Когда я ссылку на это где-то более года назад давал, вы все плевались. А теперь сами делитесь. "А шо случилось?"
А шо случилось? -- "Теперь хотеся запрещеночки "
Ну так сколько раз повторять - всё зависит от ситуации.
Ведь не обсуждается вопрос хорошо это или плохо, нужно применять или не нужно. Понадобилось кому то.
А может та ссылка была ещё выставлена в понедельник 13-го И неизвестно под каким соусом, может опять переперчили
нет ничего про Linq to Entities
А что под этим конкретно имеется виду?
Ничего особенно тут не заметил
https://learn.microsoft.com/en-us/dotnet/framework/data/ad...
А так не пробовали?
var result2 = query.Where(p => advancedCondition.Compile().Invoke(db, p)).ToList();
вот еще попалось но не разбирался. Может на что натолкнёт
https://www.roundthecode.com/dotnet-tutorials/using-linq-e...
https://www.codeproject.com/Articles/5358166/A-Dynamic-Whe...
коллега помог
static void Main(string[] args)
{
Func<DbEntities, Expression<Func<Person, bool>>> funky =
db =>
p => db.Set<Event>().Any(e => e.Author == p.Name);
SomeDbRequest(funky);
}
static void SomeDbRequest(Func<DbEntities, Expression<Func<Person, bool>>> advancedCondition)
{
using (DbEntities db = new DbEntities())
{
Expression<Func<Person, bool>> expression = advancedCondition(db);
var result2 = query.Where(expression);
}
}
с одной стороны, молодец, решил
С другой - опять же нифига не понял, в чем проблема была
static void SomeDbRequest(Func<DbEntities, Expression<Func<Person, bool>>> advancedCondition)
{
using (DbEntities db = new DbEntities())
{
var result2 = query.Where(p => db.Set<Event>().Any(e => e.Author == p.Name));
}
}
оно и без джойнов работает
вопрос был в том, как этот предикат передать извне