Объединение результатов двух запросов в C # с использованием LINQ или другого модуля - PullRequest
0 голосов
/ 18 июня 2019

У меня есть два запроса, берущие данные из одной таблицы с лямбда-выражением, и я хотел бы использовать что-то вроде метода SQL «join on» для объединения таблиц с одним идентификатором.Запросы:

    var tbl_emails_received =
        db.EmailAddresses
        .GroupBy(x => new { x.RecepientID })
        .Select(x => new
        {
            x.Key.RecepientID,
            EmailsRecieved = x.Count()

        });

и

        var tbl_emails_sent =
        db.EmailAddresses
        .GroupBy(x => new { x.SenderID })
        .Select(x => new
        {
            x.Key.SenderID,
            EmailsSent = x.Count()
        });

Я пытаюсь повторить, что делает этот MsSQL Query.Я попытался просмотреть документацию Microsoft для join (, ссылка здесь ), но для хранения объектов требуются новые классы.

WITH 
tbl_emails_received AS
    (
        SELECT RecepientID, count(FileID) AS EmailsRecieved 
        FROM tbl_ex_EmailAddresses
        GROUP BY RecepientID
    ),
tbl_emails_sent AS
    (
        SELECT SenderId, count(FileID) AS EmailsSent
        FROM tbl_ex_EmailAddresses
        GROUP BY SenderID
    )

SELECT s.SenderID as Id, r.EmailsRecieved, s.EmailsSent, 
    r.EmailsRecieved + s.EmailsSent as TotalEmails,
    slist.EmailAddress, slist.EmailName, slist.DomainName
FROM tbl_emails_received r
    JOIN tbl_emails_sent s
        ON r.RecepientID = s.SenderID

Но может быть, что LINQ или C # не могут создавать объектына лету, как с SQL делает с данными.У меня вопрос, есть ли способ, которым я могу повторить, что SQL-запрос делает в LINQ или простой C #?Есть ли лучшие практики для такого рода запросов?Есть ли другой пакет, который я мог бы использовать, который потенциально мог бы сделать это проще?

Ответы [ 2 ]

1 голос
/ 18 июня 2019

выполнить запрос на выборку в db.EmailAddresses .ToList (), чтобы получить все записи из таблицы, теперь запустить group by для receientId, SenderId поверх этого запроса. Таким образом, попадание в базу данных только один раз

1 голос
/ 18 июня 2019

Вы можете попробовать что-то вроде этого (используя два ваших начальных запроса)

var query = (from er in tbl_emails_received 
            join es in tbl_emails_sent on er.RecepientID equals es.SenderID
            select new emailsReceieved = er, emailsSent = es
            ).ToList();
EMailClass finalClass = query.select(
            x => new EMailClass
            {
            Id = x.emailsSent.SenderID,
            EmailsReceived = x.emailsReceieved.EmailsRecieved
            ...
            }).ToList();

Это не было проверено или полностью проверено. Единственная поездка в базу данных - создание query. Существует только один класс, который эквивалентен выводу вашего оператора SQL SELECT. (И это должно куда-то идти). Или вы также можете сделать этот класс анонимным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...