Улучшить производительность запросов LINQ. Запрос с "соединениями" или маленькими запросами - PullRequest
0 голосов
/ 25 июня 2019

Я получаю идентификаторы 2 таблиц и использую их для проверки наличия записи в третьей таблице.

Сводная структура таблиц:

Table 1 (int id1 and string UserName);
Table 2 (int id2 and string BranchName);
Table 3 (int Id_User and int Id_Branch);//fk table 1 and 2

Код:

...
string user = "NAME1";
string branch = "BRANCH1";

using (A_Entities context= new A_Entities())
{
    //Get user id
    var res1 = context.Table1.SingleOrDefault(x => x.UserName == user);
    int idUser = res1 != null ? res1.id1 : 0;

    //Get branch id
    var res2 = context.Table2.SingleOrDefault(x => x.BranchName == branch);
    int idBranch = res2 != null ? res2.id2 : 0;

    //Validate
    var res3 = context.Table3.SingleOrDefault(x => x.Id_User == idUser && x.Id_Branch == idBranch);
    bool result = res3 != null ? true : false;
}
...

Эта структура кода работает правильно, и я использую ее несколько раз (около 5) для разных таблиц, прежде чем показывать результат.

Чтобы иметь возможность выполнять тесты производительности и сравнивать, можете ли вы помочь мне создать унифицированный запрос? (возможно с соединениями)

1 Ответ

0 голосов
/ 25 июня 2019

Это должно объединить запросы в один. Я использовал лямбда-синтаксис с тех пор, как вы начали с этого, хотя я думаю, что в этом случае беглый синтаксис может быть легче следовать:

var result = (context.Table3.Join(context.Table1, t3 => t3.Id_User, t1 => t1.id1, (t3, t1) => new { t3, t1 })
                            .Join(context.Table2, t3t1 => t3t1.t3.Id_Branch, t2 => t2.id2, (t3t1, t2) => new { t3t1.t3, t3t1.t1, t2 })
                            .Where(t3t1t2 => t3t1t2.t1.UserName == user && t3t1t2.t2.BranchName == branch)
             )
             .Any();

Вот эквивалентный синтаксис запроса:

var res2 = (from t3 in context.Table3
            join t1 in context.Table1 on t3.Id_User equals t1.id1
            join t2 in context.Table2 on t3.Id_Branch equals t2.id2
            where t1.UserName == user && t2.BranchName == branch
            select t3
           )
           .Any();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...