我正在使用此查询和列表从 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'
如果我直接对数据库执行查询本身,我将获得这些元组:
如您所见,属性“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);
}
结果是这样的:
正如您可以比较两个图像一样,这将是数据库表中可用的第一个元组。
表的脚本创建:
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
最佳答案
Istorn!
尝试使用 foreach 而不是您的 for...
outdoor.ForEach( x => Console.WriteLine(x.value + " " + x.DtRicezione + " " + x.IdDataModelField));
尝试检查查询执行器中的数据读取器。 也许它不会进入下一行(因此您的列表每次都会收到来自数据库的同一行)。
关于C# 列表从数据库中检索元组只返回第一个可用的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56890288/