Как посчитать данные нескольких столбцов в linq - PullRequest
0 голосов
/ 12 июня 2018
SELECT country, city, COUNT(school), COUNT(collage) 
FROM T1
GROUP BY country, city

Я пишу этот запрос в Linq

var count_captainRegisterd1 = (from a in dt1.AsEnumerable()
                               group a by new
                               {
                                   oc_name = a.Field<string>("county"),
                                   oc_city = a.Field<string>("city")
                               } into g
                               select new
                               {
                                   g.Key.oc_name,
                                   g.Key.oc_city,
                                   country = g.Count()
                               }
                              ).ToList();

, но они учитывают столбец country.Я хочу, чтобы country и city оба считали

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Увы, вы забыли написать свой класс T1.Мне кажется, что помимо идентификатора он также имеет отношение Country a City и отношение один ко многим с School и Collage (вы имели в виду College?).Примерно так:

class T1
{
    public int Id {get; set;}
    public string Country {get; set;}
    public string City {get; set;}

    // relations: every T1 has zero or more Schools and Colleges:
    public virtual ICollection<School> Schools {get; set;}
    public virtual ICollection<College> Colleges {get; set;}
}
public class School
{
     public int Id {get; set;}
     // every School belongs to exactly one T1 using virtual key
     public int T1Id {get; set;}
     public virtual T1 T1 {get; set;}
     ...
}
 public class College
{
     public int Id {get; set;}
     // every College belongs to exactly one T1 using virtual key
     public int T1Id {get; set;}
     public virtual T1 T1 {get; set;}
     ...
}
class MyDbContext : DbContext
{
    public DbSet<T1> T1s {get; set;}
    public DbSet<School> Schools {get; set;}
    public DbSet<College> Colleges {get; set;}
}

Этого достаточно для структуры сущностей, чтобы понять, какой тип отношений вы хотите разработать.

Ваш запрос будет:

var result = myDbContext.T1s.GroupBy(item => new {item.Country, item.city})
    .Select(group => new
    {
        Country = group.Key.Country,
        City = group.Key.City,
        NumberOfSchools = group.SelectMany(groupElement => groupElement.Schools)
           .Count(),
        NumberOfColleges = group.SelectMany(groupElement => groupElement.Colleges)
            .Count(),
    })

Словами: из каждого элемента в вашей последовательности T1 составьте группы элементов с одинаковой комбинацией город / страна.Может быть несколько одинаковых комбинаций город / страна (в США есть много мест, называемых Йорк).Таким образом, группа может иметь несколько элементов.Из каждого элемента в группе возьмите общий город / страну, который хранится в ключе группы.Из всех элементов в группе возьмите Школы и сосчитайте все Школы вместе.Сделайте то же самое с колледжами.

Помните: вы получаете Школы из Йорка в Аризоне и Йорка в Южной Дакоте вместе.Не уверен, что это именно то, что вам нужно, но именно это делает ваш SQL.

Последнее замечание

Каждый город находится в стране.Каждая страна имеет ноль или более городов.Разве не было бы лучше поместить города и страны в свои собственные таблицы с отношением один ко многим?Например, если вы переименуете «Ленинград» в «Синт-Петербург», хотите ли вы обновить таблицу всех «Персонов»?И если «Севастополь» изменит страну с «Украины» на «Российскую Федерацию», вы бы тоже хотели обновить всех граждан?Выбирайте таблицы и идентификаторы так, чтобы, если у вас есть вещь, она не стала другой, если она поменяла имя или местоположение.

0 голосов
/ 12 июня 2018

это ваш запрос:

var count_captainRegisterd1 = 
    (from a in dt1.AsEnumerable()
     group a by new
     {
         oc_name = a.Field<string>("county"),
         oc_city = a.Field<string>("city")
     } into g
     select new
     {
          Country = g.Key.oc_name,
          City = g.Key.oc_city,
          SchoolCount = g.Count(r => !string.IsNullOrWhiteSpace(r.Field<string>("school"))),
          CollageCount = g.Count(r => !string.IsNullOrWhiteSpace(r.Field<string>("collage")))
      }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...