Список C #, извлекающий кортежи из базы данных, возвращает только первый доступный кортеж - PullRequest
3 голосов
/ 04 июля 2019

Я получаю кортежи из базы данных MSSQL с этим запросом и списком:

string query3 = @"select * from HistoryMessageValues where IdMessage in (select id from HistoryMessages where IDDevice in ("+listIDs+")) and (DtRicezione between '" + fromdate.ToString("yyyy-dd-MM") + "' and '" + todate.ToString("yyyy-dd-MM") + "')";
List<HistoryMessageValues> totalm= dbMngr.Set<HistoryMessageValues>().FromSql(query3).ToList();
List<HistoryMessageValues> outdoor = totalm.Where(x => x.IdDataModelField==Guid.Parse("9f5d1fe3-27d7-44ee-bea4-02b36897f9af")).ToList(); 

Запрос написан явно так:

select * from HistoryMessageValues where IdMessage in (select id from HistoryMessages where IDDevice in ('7b6d6ca2-4d87-4334-9477-d96925d992c4' )) and (DtRicezione between '2010-01-01' and '2019-01-08')
and IdDataModelField='9f5d1fe3-27d7-44ee-bea4-02b36897f9af'

Если я выполню запрос непосредственно к БД, я получу следующие кортежи:

Tuples obtained through query execution

Как видите, атрибуты "value" и "DtRicezione" отличаются (по крайней мере, большей частью) от кортежей.

Между тем, я получаю только первый реплицированный сотен реплицированных.

Действительно, выполняя следующий цикл, после этого 3 строки C # в моем бэкэнде:

List<HistoryMessageValues> outdoor = totalm.Where(x => x.IdDataModelField==Guid.Parse("9f5d1fe3-27d7-44ee-bea4-02b36897f9af")).ToList(); 
for (int i=0;  i<outdoor.Count(); i++)
{
    Console.WriteLine(outdoor.ElementAt(i).value + " " + outdoor.ElementAt(i).DtRicezione + " " + outdoor.ElementAt(i).IdDataModelField);
}

Результат таков:

Result after iteraion

Как вы можете сравнить два изображения, это будет первый кортеж, доступный в таблице БД.

Создание скрипта таблицы:

    SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[HistoryMessageValues](
    [id] [bigint] NOT NULL,
    [IdDataModelField] [uniqueidentifier] NOT NULL,
    [value] [nvarchar](50) NOT NULL,
    [IdMessage] [bigint] NOT NULL,
    [DtRicezione] [datetime] NULL,
    [idKey] [uniqueidentifier] NULL
) ON [PRIMARY]
GO

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Istorn!

Попробуйте использовать foreach вместо вашего для ...

outdoor.ForEach( x => Console.WriteLine(x.value + " " + x.DtRicezione + " " + x.IdDataModelField));

Попробуйте проверить ваш datareader внутри вашего исполнителя запросов. возможно, он не перейдет к следующей строке (поэтому ваш список будет получать каждый раз одну и ту же строку из базы данных).

0 голосов
/ 05 июля 2019

LINQ имеет небольшую фразу «Мне все равно».

До того, как я изменил таблицу «HistoryMessageValues» и собственную контекстную связь, у него не было явного первичного ключа : действительно, у него был один атрибут, рассматриваемый как uniqueidentifier : "IdDataModelField".

Из-за двух особенностей Guid (в C # это тип данных, рассматриваемый для столбцов uniqueidentifier), упомянутый атрибут рассматривался как первичный ключ ghost при обработке любого вида запроса: как видите, в сообщаемом скрипте учитывался только первый кортеж, реплицированный несколько раз.

Так что я попытался добавить атрибут idKeyкак первичный ключ uniqueidentifier со значением NEWID () по умолчанию и, конечно, изменил связанный класс, добавив ограничение:

   entity.Property(e => e.idKey).HasColumnName("idKey");
   entity.HasKey(e => e.idKey);

После этого обновления все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...