Мне нужно запросить таблицу значений в двух повторяющихся столбцах - PullRequest
1 голос
/ 05 мая 2019

Я работаю в ASP.NET Core. У меня проблема с запросом строк, которые имеют одинаковые User_id и Definition_id, если они есть, мне нужен идентификатор строки.

+----+---------+---------------+
| Id | User-id | Definition-id |
+----+---------+---------------+
|  1 |       1 |             1 |
|  2 |       2 |             1 |
|  3 |       2 |             2 |
|  4 |       3 |             1 |
|  5 |       4 |             1 |
|  6 |       4 |             1 |
|  7 |       5 |             2 |
|  8 |       6 |             1 |
+----+---------+---------------+

Мне нужно запросить таблицу, как эта, чтобы вернуть {5, 6} мне, поскольку они имеют идентичные идентификаторы пользователя И определения. Я пробовал Groupby для обоих значений, но я не могу получить IQueriable или IGrouping, чтобы дать мне идентификатор конкретной строки.

Я бы предположил, что это так работает, но это не так.

var placementsWithDuplicates =
    from p in _context.Placements
    group p by new { p.User_id, p.Definition_id } into what
    select new
    {
        Id = what.Id,
        User = what.User_id,
        Defi = what.Definition_id,
    };

foreach (var p in placementsWithDuplicates)
{
    issues.Add(new IssueModel()
        {
            Type = "Praxe ID[" + p.Id + "]",
            Name = "User id [" + p.User + "], Definition id [" + p.Defi + "]",
            Detail = "So user shouldnt have data for more definitons!"
        });
};

Спасибо Satish Hirpara за лучший ответ, потребовалось небольшое обновление, поэтому я выложил сообщение, которое в итоге получилось хорошо:

var B = from p in _context.Placements
        group p by new { p.User_id, p.Definition_id } into what
        where what.Count() > 1
        select new
        {
            User_id = what.Key.User_id,
            Definition_id = what.Key.Definition_id
        };

var placementsWithDuplicates = from A in _context.Placements
                               join b in B on new { A.User_id, A.Definition_id } equals new { b.User_id, b.Definition_id }
                               select A;

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Ниже приведен SQL-запрос:

    SELECT A.* 
    FROM Placements A 
    INNER JOIN 
     (SELECT User_id, Definition_id FROM Placements 
      GROUP BY User_Id, Definition_id 
      HAVING COUNT(*) > 1) B 
     ON A.User_id = B.User_id AND A.Defination_id = 
     B.Defination_id

Вы можете создать временную таблицу, чтобы избежать объединения подзапроса.

Если вы хотите запрос linq, я попытался создать его сверхузапрос, пожалуйста, найдите его ниже:

 --- sub query
 var B = from p in Placements 
 group p by new { p.User_id, p.Definition_id } into what 
 where what.count() > 1
 select new
   { User_id = what.User_id, 
     Definition_id =what.Definition_id 
    }; 

    --- join
    Var result =  from A in Placements
                          Join B ON A.User_id = B.User_id 
                          AND A.Defination_id = B.Defination_id
                          Select A

Пожалуйста, попробуйте этот.

0 голосов
/ 05 мая 2019

Попробуйте

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