Как применить соединение на основе параметра с помощью linq

#linq #join

#linq #Присоединиться

Вопрос:

Я использую лямбда-выражение для построения запроса, и я застрял в ситуации, когда мне нужно применить соединение с 2 таблицами, но оно будет основано на параметре, например, если параметр «status = 1», то соединение должно применяться между 2 таблицами, а если «status = 0», то соединение не требуетсячтобы быть примененным там.

Как можно применить соединение на основе какого-либо параметра? Пожалуйста, помните, что я не хочу переписывать запрос 2 раза с условиями if и else. Мне нужно сделать это с помощью одного запроса.

Ниже приведен мой запрос:

    db.Users.AsQueryable().AsExpandable().Where(featuredUserPredicate)
                     .GroupJoin(db.UserProfile, u => u.UserID, up => up.UserID, (u, up) => new { Users = u, UserProfile = up })
                     .SelectMany(s => s.UserProfile.DefaultIfEmpty().AsEnumerable(), (s, up) => new { s, up })


                    .GroupJoin(db.ProjectReview, u => u.s.Users.UserID, pr => pr.ReviewForUserId, (u, pr) => new
                     {
                         u,
                         pr

                     }).SelectMany(s => s.pr.DefaultIfEmpty().AsEnumerable(), (s, pr) => new
                     {

                         s.u,
                         Rate = pr == null ? 0 : pr.Rate

                     }).GroupBy(g => new { g.u.s.Users }).Select(r => new
                     {

                         key = r.Key.Users.UserID,
                         name = r.Key.Users,
                         sum = r.Sum(l => l.Rate)
                     }))
 

В приведенном выше запросе я хочу добавить еще одно соединение из таблицы «usercategory», но это соединение будет основано на значении «статус». Если значение «status = 1», то соединение будет применено, в противном случае этот запрос будет выполняться как есть.

Комментарии:

1. «Я не хочу переписывать запрос 2 раза с условиями if и else. Мне нужно сделать это с помощью одного запроса «. Почему?

2. поскольку у меня много параметров, нет ни одного параметра, к которому я должен применить соединение. У меня есть «статус», как и у многих параметров. Поэтому мне придется написать if else для всех из них, если я выберу if else. Я не хочу усложнять его. Если у вас есть какое-либо простое решение, пожалуйста, предложите мне. Спасибо за быстрый ответ.

3. Вы можете попробовать синтаксический анализ дерева выражений для генерации динамических запросов LINQ.

4. Можете ли вы показать свой запрос с помощью join (ов)?

5. Каф, я отредактировал свой вопрос и упомянул свой запрос выше, пожалуйста, посмотрите.

Ответ №1:

Вы можете создать свой объект запроса следующим образом.

 var query = context.MyTable; //main query

query = status == 1 ? query.Join() : query; //apply join conditionally

query = query.Where()       // more expressions, might also need conditions here
query = query.Skip().Take() // apply your paging here
var result = query.ToList();// this is where the query will be executed.
 

Комментарии:

1. Спасибо за быстрый ответ. Я не могу использовать вышеуказанные параметры в качестве первой строки «var query = context. MyTable;» получит все записи из базы данных, но я не хочу получать все записи за один раз. Мне нужно всего 10 записей за один раз. Итак, я применил пользовательскую подкачку в своем коде. Таким образом, если я получу только 10 записей и в соответствии с вашим кодом, я применю соединение после получения 10 записей. Это будет неправильно. Вот почему я не могу использовать эту опцию

2. @VipinRathore — В первую строку не будут получены все записи из базы данных. На самом деле, он ничего не получает. Linq использует модель отложенного выполнения, поэтому никакие записи не будут возвращены, пока вы не выполните окончательный запрос, и если вы отфильтровали или выгрузили результаты, вы получите только связанные записи.

3. @VipinRathore, пожалуйста, ознакомьтесь с комментарием об отложенном выполнении. Я немного обновил код, чтобы было понятно.

4. Спасибо AD.Net чтобы объяснить мне значение отложенного процесса выполнения. Это действительно полезно для меня, и, наконец, я получил свое решение. Большое спасибо.

5. Благодаря Enigmativity также, чтобы помочь мне найти мое решение.