Deutsch

Страсти по делегатам

1317  1 2 3 4 все
Срыв покровов патриот14.03.24 16:43
14.03.24 16:43 

Всем привет, особенно староверам, стирающим бельё в проруби.


В общем задача на Entity Framework. Как динамично передавать фильтры в запросы, мы уже проходили в прошлой ветке.
Теперь хотеся запрещеночки - передавать условия, связанные с другими Entities.

Но что-то не пойму как.


то есть запрос должен получится примерно такой

Select * from Person P

where exists (

select 1 from Event E

where E.name = P.Name

)


код: https://onlinegdb.com/htZocG0E4

#1 
Murr патриот14.03.24 17:40
Murr
NEW 14.03.24 17:40 
в ответ Срыв покровов 14.03.24 16:43

Давно не делал и могу напутать, но вроде там ничего сложного не было - просто перечисляешь используемые через запятую и пользуешь.

#2 
alex445 коренной житель14.03.24 18:00
NEW 14.03.24 18:00 
в ответ Срыв покровов 14.03.24 16:43
Срыв покровов патриот14.03.24 18:42
NEW 14.03.24 18:42 
в ответ alex445 14.03.24 18:00

не хочу, с таким же успехом я могу чистый SQL писать

#4 
AlexNek патриот14.03.24 19:07
AlexNek
NEW 14.03.24 19:07 
в ответ Срыв покровов 14.03.24 16:43

Никогда подобное еще не интересовало.


Но вроде пользуются только двумя вариантами: Expression trees и Dynamic LINQ library

https://www.bytehide.com/blog/dynamic-linq-query-csharp

Вот может быть интересная реализация

https://blog.jeremylikness.com/blog/dynamically-build-linq...


#5 
alex445 коренной житель14.03.24 19:29
NEW 14.03.24 19:29 
в ответ Срыв покровов 14.03.24 18:42
не хочу, с таким же успехом я могу чистый SQL писать

Не с таким же.

#6 
alex445 коренной житель14.03.24 21:02
NEW 14.03.24 21:02 
в ответ AlexNek 14.03.24 19:07

Вот может быть интересная реализация

https://blog.jeremylikness.com/blog/dynamically-build-linq...

Когда я ссылку на это где-то более года назад давал, вы все плевались. А теперь сами делитесь. "А шо случилось?"

#7 
AlexNek патриот14.03.24 21:22
AlexNek
NEW 14.03.24 21:22 
в ответ alex445 14.03.24 21:02, Последний раз изменено 14.03.24 21:23 (AlexNek)
А шо случилось? -- "Теперь хотеся запрещеночки "

Ну так сколько раз повторять - всё зависит от ситуации.

Ведь не обсуждается вопрос хорошо это или плохо, нужно применять или не нужно. Понадобилось кому то.


А может та ссылка была ещё выставлена в понедельник 13-го смущ И неизвестно под каким соусом, может опять переперчили бебе

#8 
Срыв покровов патриот14.03.24 22:54
NEW 14.03.24 22:54 
в ответ AlexNek 14.03.24 19:07

по первой ссылке нет ничего про Linq to Entities

По второй - если оно и заработает, то оно все без синтаксической проверки - то есть очень большая опасность словить ошибку в рантайме.

#9 
AlexNek патриот14.03.24 23:28
AlexNek
NEW 14.03.24 23:28 
в ответ Срыв покровов 14.03.24 22:54
нет ничего про Linq to Entities

А что под этим конкретно имеется виду?


Ничего особенно тут не заметил смущ

https://learn.microsoft.com/en-us/dotnet/framework/data/ad...

#10 
Срыв покровов патриот15.03.24 06:25
NEW 15.03.24 06:25 
в ответ AlexNek 14.03.24 23:28

пол этим имеется в виду, что не любой Linq переводится в SQL.

#11 
AlexNek патриот15.03.24 18:06
AlexNek
NEW 15.03.24 18:06 
в ответ Срыв покровов 14.03.24 16:43

А так не пробовали?

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...

#12 
Срыв покровов патриот16.03.24 07:39
NEW 16.03.24 07:39 
в ответ AlexNek 15.03.24 18:06

так ошибка вылетает еще перед обращением в БД.

ToList тут не поможет.

#13 
Murr патриот16.03.24 07:58
Murr
NEW 16.03.24 07:58 
в ответ Срыв покровов 16.03.24 07:39

А ты ее в ToSql() конвертни и погляди что там будет.

#14 
Срыв покровов патриот16.03.24 19:43
NEW 16.03.24 19:43 
в ответ Murr 16.03.24 07:58

в ПН попробую

#15 
Срыв покровов патриот25.03.24 14:18
NEW 25.03.24 14:18 
в ответ Срыв покровов 14.03.24 16:43

коллега помог up

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);
    }
}
#16 
7495 старожил25.03.24 15:40
7495
NEW 25.03.24 15:40 
в ответ Срыв покровов 25.03.24 14:18

с одной стороны, молодец, решил

С другой - опять же нифига не понял, в чем проблема была

Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#17 
alex445 коренной житель25.03.24 15:53
NEW 25.03.24 15:53 
в ответ Срыв покровов 14.03.24 16:43, Последний раз изменено 25.03.24 15:53 (alex445)

то есть запрос должен получится примерно такой

Select * from Person P
where exists (
select 1 from Event E
where E.name = P.Name
)

Чёт не понял. А так почему не подходит? Или джойны, как там же сказали.

#18 
Срыв покровов патриот25.03.24 16:38
NEW 25.03.24 16:38 
в ответ alex445 25.03.24 15:53
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));
    }
}

оно и без джойнов работает
вопрос был в том, как этот предикат передать извне

#19 
Срыв покровов патриот25.03.24 16:40
NEW 25.03.24 16:40 
в ответ 7495 25.03.24 15:40
oпять же нифига не понял, в чем проблема была

это ветка не совсем для тебя, чел. Сорри

#20 
1 2 3 4 все