Результат запроса Linq Sql отличается от SQL-запроса, выполняемого в базе данных

#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»), «Выберите шаблон сообщения»)