我有一个存储过程:
CREATE PROCEDURE SELECT_Some_Data
@Sreachstr nvarchar(200)
AS
BEGIN
SELECT ROW_NUMBER() OVER(ORDER BY [Document].DocNo DESC) AS Row,*
FROM Document WHERE DocNo=@Sreachstr
END
当我用@Sreachstr='153'
执行它时,它会返回15条记录。
我使用Entity Framework来获取存储过程返回的数据:
public static List<DocumentInfo_Full_Data> SelectByDocNo(string SearchStr)
{
using (LibEntities_new db = new LibEntities_new())
{
return SelectByDocNo(db, SearchStr);
}
}
private static List<DocumentInfo_Full_Data> SelectByDocNo(LibEntities_new db, String SearchStr)
{
return db.SelectByDocNo(SearchStr).ToList();
}
public ObjectResult<DocumentInfo_Full_Data> SelectByDocNo(global::System.String searchStr)
{
ObjectParameter searchStrParameter;
if (searchStr != null)
{
searchStrParameter = new ObjectParameter("SearchStr", searchStr);
}
else
{
searchStrParameter = new ObjectParameter("SearchStr", typeof(global::System.String));
}
return base.ExecuteFunction<DocumentInfo_Full_Data>("SelectByDocNo", searchStrParameter);
}
当我使用参数SearchStr="15"
调用此方法时,我看到一条记录重复了15次,而不是15条不同的记录。
答案 0 :(得分:1)
当我从EF视图中选择行时,我曾经遇到过这种情况。
由于视图本身没有主键,因此EF无法确定键 - 而是EF根据视图中所有不可为空的列创建了“猜测”键。
我的视图返回了四行数据,例如
Col1 Col2 Col3 Col4
1 2 'ABC' 42
1 2 'DEF' 57
1 2 'GHI' 4711
1 2 'JKL' 404
- &GT;我的查询在SQL Server Management Studio中工作很好。
EF猜测的“关键”基于(Col1, Col2)
。
现在,当我使用EF检索行时,会发生这种情况:
(1,2)
再次),因此它假设这又是同一行;相同的密钥 - &gt;同一行,以便同一实体存储第二,第三和第四次所以最后,我从EF那里得到的是
Col1 Col2 Col3 Col4
1 2 'ABC' 42
1 2 'ABC' 42
1 2 'ABC' 42
1 2 'ABC' 42
因为确定EF中实体唯一性的键对于数据库中的四列中的每一列都是相同的。
因此,在您的情况下也可能发生这种情况 - 特别是如果您为存储过程返回的数据创建了新的复杂类型 - 以及EF实体上的键({{1未正确设置为数据库中实际的,真正标识的列(或列集)。看看吧!