映射到 TemplateContext.Database.SqlQuery 函数中的对象时记录重复

Posted

技术标签:

【中文标题】映射到 TemplateContext.Database.SqlQuery 函数中的对象时记录重复【英文标题】:Records getting duplicated when mapped to object in TemplateContext.Database.SqlQuery function 【发布时间】:2016-10-16 07:21:17 【问题描述】:

当我使用 TemplateContext 调用这样的存储过程时,我遇到了奇怪的问题

string query = "exec SearchRequest @recct = @TotalCount OUTPUT" + parametersString.ToString();
var requestDtos = ctx.Database.SqlQuery<RequestDto>(query, totalCount).ToList();

这有时会在requestDtos 中获得 30 个对象,有时是 60 个对象,而数据库实际上根据我传递给存储过程的 PageSize 参数返回正确的行数,但奇怪的是,在映射到时记录会重复对象。

因此,如果页面大小为 10,我将获得 30 或 60 个重复的对象,而不是获得 10 个对象。

知道这种奇怪的行为吗?

【问题讨论】:

我认为你需要在.Distinct()之后像.Distinct().Take(10).ToList();一样做.Take(10) 我更新了我的问题,实际上我尝试调用 distinct 因为重复的对象行为,它不在原始代码中。问题是它实际上不应该复制对象。 那你可以这样试试(query, totalCount).Take(10).ToList(); 但是我为什么要这样做呢?问题是为什么当数据库只返回 10 条记录时它会记录 30 或 60 条记录。它应该直接与这个 ctx.Database.SqlQuery&lt;RequestDto&gt;(query, totalCount).ToList(); 一起工作 我在问题中提到,当我在传递给代码的数据库中运行相同的查询时,它返回正确的否。的行。因此,当我通过 sql server management studio 运行相同的查询时,以及在映射记录被复制后的代码中,相同的查询返回 10 条记录。 【参考方案1】:

您没有正确传递参数。我建议你使用下面的代码:

var outParam = new SqlParameter();
outParam.ParameterName = "TotalCount";
outParam.SqlDbType = SqlDbType.Int;
outParam.ParameterDirection = ParameterDirection.Output;

var requestDtos = dbContext.Database.SqlQuery<MyType>("SearchRequest @recct, @TotalCount OUT", 
               new SqlParameter("recct", parametersString.ToString()), 
               outParam);
var result = requestDtos.ToList();
var totalCount = (int)outParam.Value;

【讨论】:

我以同样的方式传递变量。我只发布了两行代码,我在我的代码中做同样的事情。如果我不这样做,它会抛出异常。它正在运行,这意味着我正在正确传递所有内容。

以上是关于映射到 TemplateContext.Database.SqlQuery 函数中的对象时记录重复的主要内容,如果未能解决你的问题,请参考以下文章

linux中匿名内存映射映射到哪个文件?

外网如何映射本地磁盘

如何将内网的机器映射到外网?

Excel里怎么处理 XML 映射?

Tomcat——Mapper(url到Wrapper的映射)

LocalDateTime 映射到 Oracle DATE,但不映射到 H2 DATE