#c# #sql #linq
#c# #sql #linq
Вопрос:
Когда я запускаю запрос в коде C # с использованием Linq, возвращаемый результат отличается от sql-запроса, выполняемого в sql server
SQL-запрос
SELECT TOP (1000) [Teamid]
,[TeamName]
,[TemplateId]
,[TemplateName]
FROM [MPFT_SendIT].[dbo].[VMTemplate]
where
Teamid=1
Результат
SQL-запрос представления VMTemplate
SELECT dbo.Team.Id AS Teamid, dbo.Team.TeamName,
dbo.MessageTemplate.Id AS TemplateId,
dbo.MessageTemplate.TemplateName
FROM dbo.Team INNER JOIN
dbo.TemplateLookup ON dbo.Team.Id =
dbo.TemplateLookup.TeamId INNER JOIN
dbo.MessageTemplate ON dbo.TemplateLookup.TemplateId =
dbo.MessageTemplate.Id
where
TeamId= 1
Linq SQL
var teamid = _db.TeamLookups.Where(i => i.UserId == 20).Select(x =>
x.TeamId).ToList(); // teamid return value is 1
ViewBag.messageTemplate = _db.VMTemplates.Where(i =>
teamid.Contains(i.Teamid));
Запрос Linq возвращает только одну строку записи 1 sql-запроса вместо 2 записей, как ожидалось. Любая помощь в решении этой проблемы?
Комментарии:
1. Вы точно проверили, что
SSMS
запрос иLinq
запрос выбираются из одной и той же базы данных?2. Почему SQL использует: «Teamid= 1», в то время как linq использует «i.userId == 20»?
3. @jdweng Я использую userid = 20 в таблице teamlookup, чтобы получить идентификатор команды, и я использую этот идентификатор команды во втором запросе для отображения данных в VMTemplate. Я проверил, что оба запроса выполняются из одной и той же базы данных
4. Вносили ли вы какие-либо изменения в базу данных после построения
Linq
модели?5. @jdweng вы правы. это проблема, с которой я сталкиваюсь
Ответ №1:
Почему Contains()
? Вы должны использовать оператор равенства, а
_db.VMTemplates.Where(i => teamid == i.Teamid).ToList();
Согласно вашему комментарию, тогда ваше выражение Linq должно работать нормально. Добавьте ToList()
к нему a
ViewBag.messageTemplate = _db.VMTemplates.Where(i =>
teamid.Contains(i.Teamid)).ToList();
Комментарии:
1. Я использую contain, потому что var teamid = _db.TeamLookups . Где(i => i.userId == 20). Выберите(x => x.TeamID). ToList() может возвращать более одного значения
2. @EricMbiada итак, вам нужны все идентификаторы teamid или только teamid=1?
3. Мне нужен весь результат из VMTemplates, где i.Teamid = teamid Я использую teamid= 1 в этом случае, потому что я не хотел возвращать много записей
4. @EricMbiada, как вы используете
ViewBag.messageTemplate
?5. @akos. pinter Я передаю результат viewbag в выпадающий Html.DropDownList(«MessageTemplate», новый список выбора (ViewBag.MessageTemplate, «templateId», «TemplateName»), «Выберите шаблон сообщения»)