shaprpuff Ответов: 2

Как показать все категории, соединив две таблицы и показав 0, если категория не существует?


У меня есть tbl1 и tbl2

tbl1:

идентификационная служба
==================
1 Microsoft
2 Оракул
3 Java


tbl2

RollNumber Услуги
==========================
Microsoft 13
Microsoft 12
Java 2
Java 16
Microsoft 15

Как я могу получить, как показано ниже, используя linq:

Количество Услуг
===================
Microsoft 3
Java 2
Оракул 0

Что я уже пробовал:

var data = from t1 in tbl1
присоединяйтесь к t2 в tbl2
на Т1.сервисе.Отделка() равна Т2.Обслуживание.Trim() в eGroup
из t2in с egroup.Метода defaultifempty()

2 Ответов

Рейтинг:
2

OriginalGriff

Вы делаете это неправильно: tbl2 должен содержать ServiceID, а не имя:

ServiceID RollNumber
1          13
1          12
3           2
3          16
2          15
И используйте соединение для доступа к имени службы.

Это действительно делает окончательный запрос, который вы хотите немного сложнее, но не намного:
SELECT a.Service, ISNULL(b.CNT, 0) 
FROM tbl1 a
LEFT JOIN (SELECT ServiceID, COUNT(RollNumber) AS CNT 
           FROM tbl2
           GROUP BY ServiceID) b 
       ON a.ID = b.ServiceID
И сделай себе два одолжения:
1) Используйте разумные имена таблиц! Это делает ваши запросы намного более удобочитаемыми и, следовательно, надежными...
2) Добавьте столбец IDENTITY id в tbl2, чтобы предотвратить дублирование. Вам не нужно использовать его в большинстве ваших запросов, но SQL не позволит вам иметь повторяющиеся строки.


shaprpuff

обе таблицы взяты из разных баз данных, поэтому я не могу добавить ключ к базе данных, я присоединился к ним с помощью linq.

Maciej Los

Вы правы, ОГ, но ОП хочет получить количество услуг в таблице № 1 на основе данных в таблице № 2.
Пожалуйста, смотрите мой ответ.

Рейтинг:
2

Maciej Los

Попробовать это:

var data = from t1 in tbl1
    join t2 in tbl2 on t1.Service.Trim() equals t2.Service.Trim() into eGroup
    from together in eGroup.DefaultIfEmpty()
    select new 
    {
       Service = together.?Service,
       Count = together.Count()
    };

Для получения более подробной информации, пожалуйста, смотрите: Выполнение левых внешних соединений (LINQ в C#) | Microsoft Docs[^]

Другой способ-вычислить количество записей в таблице № 2 на основе имени службы:
var result = tbl1
	.Select(x=> new
	{
		Service = x.Service,
		Count = tbl2.Count(y=> y.Service.Trim()==x.Service.Trim()))
	});


Удачи вам!