LINQ к SQL с помощью GROUP BY и (ОТЛИЧНОГО) КОЛИЧЕСТВА

58
задан Brian Webster 19 February 2013 в 23:13
поделиться

3 ответа

Нет прямой поддержки COUNT(DISTINCT {x})), но можно моделировать ее от IGrouping<,> (т.е. что group by возвраты); я боюсь, что только "делаю" C#, таким образом, необходимо будет перевести в VB...

 select new
 {
     Foo= grp.Key,
     Bar= grp.Select(x => x.SomeField).Distinct().Count()
 };

Вот пример Northwind:

    using(var ctx = new DataClasses1DataContext())
    {
        ctx.Log = Console.Out; // log TSQL to console
        var qry = from cust in ctx.Customers
                  where cust.CustomerID != ""
                  group cust by cust.Country
                  into grp
                  select new
                  {
                      Country = grp.Key,
                      Count = grp.Select(x => x.City).Distinct().Count()
                  };

        foreach(var row in qry.OrderBy(x=>x.Country))
        {
            Console.WriteLine("{0}: {1}", row.Country, row.Count);
        }
    }

TSQL не вполне, что мы хотели бы, но он делает задание:

SELECT [t1].[Country], (
    SELECT COUNT(*)
    FROM (
        SELECT DISTINCT [t2].[City]
        FROM [dbo].[Customers] AS [t2]
        WHERE ((([t1].[Country] IS NULL) AND ([t2].[Country] IS NULL)) OR (([t1]
.[Country] IS NOT NULL) AND ([t2].[Country] IS NOT NULL) AND ([t1].[Country] = [
t2].[Country]))) AND ([t2].[CustomerID] <> @p0)
        ) AS [t3]
    ) AS [Count]
FROM (
    SELECT [t0].[Country]
    FROM [dbo].[Customers] AS [t0]
    WHERE [t0].[CustomerID] <> @p0
    GROUP BY [t0].[Country]
    ) AS [t1]
-- @p0: Input NVarChar (Size = 0; Prec = 0; Scale = 0) []
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

результаты, однако, корректны - поддающийся проверке путем выполнения его вручную:

        const string sql = @"
SELECT c.Country, COUNT(DISTINCT c.City) AS [Count]
FROM Customers c
WHERE c.CustomerID != ''
GROUP BY c.Country
ORDER BY c.Country";
        var qry2 = ctx.ExecuteQuery<QueryResult>(sql);
        foreach(var row in qry2)
        {
            Console.WriteLine("{0}: {1}", row.Country, row.Count);
        }

С определением:

class QueryResult
{
    public string Country { get; set; }
    public int Count { get; set; }
}
89
ответ дан Marc Gravell 24 November 2019 в 18:57
поделиться

Linq к sql не имеет никакой поддержки количества (Отличный...). Поэтому необходимо отобразить метод.NET в коде на функцию SQL-сервера (таким образом количество (отличный..)) и использование это.

btw, не помогает, отправляете ли Вы псевдо код, скопированный с инструментария в формате, это ни VB.NET, ни C#.

1
ответ дан Frans Bouma 24 November 2019 в 18:57
поделиться

Это - то, как Вы делаете отличный запрос количества. Обратите внимание, что необходимо отфильтровать пустые указатели.

var useranswercount = (from a in tpoll_answer
where user_nbr != null && answer_nbr != null
select user_nbr).Distinct().Count();

, Если Вы комбинируете это с в Ваш текущий код группировки, я думаю, что у Вас будет свое решение.

1
ответ дан GeekyMonkey 24 November 2019 в 18:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: