映射到 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<RequestDto>(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 函数中的对象时记录重复的主要内容,如果未能解决你的问题,请参考以下文章