2012-04-29 2 views
1

Мне нужно количество городов для каждого состояния и всех столбцов таблицы состояний в наборе результатов выбора. У меня есть запрос TSQL, но я не знаю, как решать внутренний запрос и группировать в LINQ.Преобразование запроса TSQL в LINQ

Штатов Таблица

StateID,StateName,Description,Address,SectionName 

Город Таблица:

CityID,StateID,Address,Description 

Здесь TSQL запрос должен быть преобразован в LINQ

declare @State varchar(100) 
set @State='IL' 

SELECT s.*,oCities.CityCount 
from ( 
     Select c.StateID,count(*) CityCount 
     from States s inner join Cities c on 
     s.StateID =c.StateID 
     where s.StateName [email protected] 
     group by c.StateID 
    ) oCities inner join States s on oCities.StateID = s.StateID 
where s.StateName [email protected] 

Предпочтительно в C# языка, но любая помощь будет оценена

+0

[Переполнение стека не является услугой перевода кода] (http://meta.stackexchange.com/a/129362/172141) –

+0

Oded, Да, я знаю его не для перевода. Я написал простые запросы LINQ для выполнения простого выбора, но застрял в этих запросах, поэтому решил обратиться за помощью. Я еще опыт, но новичок в LINQ. – Munawar

ответ

3

Если предположить, что внешние ключи были определены и импортированы правильно, то что-то подобное должно работать

var state = states.Where (s => s.StateName == name).Select (
    s => new {State=s, CityCount=s.Cities.Count()}).SingleOrDefault(); 

Использование Linq для SQL это переводится как

SELECT [t2].*, [t2].[value] AS [CityCount] 
FROM (
    SELECT [t0].*, (
     SELECT COUNT(*) 
     FROM [City] AS [t1] 
     WHERE [t1].[StateId] = [t0].[Id] 
     ) AS [value] 
    FROM [State] AS [t0] 
    ) AS [t2] 
WHERE [t2].[StateName] = @p0 

где p0 ваш параметр @state.

+0

Первое решение сработало, но мне пришлось присоединиться и повторно импортировать таблицы, потому что они не были объединены раньше, и я тоже этого захотел. -благодаря – Munawar

2
var q1 = 
from c in cities 
join s in states 
on c.StateID equals s.StateID 
where s.StateName=statename 
select new {city=c, state=s}; 

var result = q1.GroupBy(x=>x.state.StateID) 
       .Select(x=>new {Count = x.Count(), state = x.First().state}); 
+0

У меня возникла ошибка времени компиляции: «внутреннее соединение s в состояниях на s.StateID равно s.StateID». Я удалил внутреннее, тогда ошибка была упущена, но при запуске была исключена нулевая ссылка: «Ссылка на объект не установлена ​​в экземпляр объекта « – Munawar

+0

@Needo, я написал' s' в обеих частях, одна часть должна быть 's', а одна часть должна быть' c', используйте мое редактирование. –

+0

Да, я заметил и исправил перед запуском запрос, но все еще получаю исключение для исключения ссылок. Я новичок в LINQ, поэтому не знаю, что с ним не так, но данные выглядят правильно, потому что запрос TSQL возвращает правильные данные. – Munawar

Смежные вопросы