实体框架:Sql参数已由另一个sql集合包含

时间:2016-03-03 11:10:57

标签: entity-framework c#-4.0 entity-framework-5

我使用实体框架,我的页面中有网格和分页,我为数据源创建了一个sql视图。

我得到的总记录如下,

totalRecords = _data.Database.SqlQuery<int>("select count(*) from MyView " + whereClause, parameters.ToArray()).Single();

我立即调用相同的视图来提取数据以及pagesize和page index。

totalRecords = _data.Database.SqlQuery<int>("select count(*) from FMRQueue " + whereClause, parameters.ToArray()).Single();
var fmrs = _data.Database.SqlQuery<QueueItemModel>(selectQuery, parameters.ToArray()).Skip(displayStartIndex).Take(recordsPerPage).ToList();

抛出"The SqlParameter is already contained by another SqlParameterCollection."例外。

请帮帮我。

1 个答案:

答案 0 :(得分:1)

SqlParameter只能由单个集合拥有。您需要手动克隆参数以将其添加到第二个集合(您的第二个查询)。

这是一个扩展方法“Clone”,它使用内部方法“Copy”来克隆参数。

var clonedParameters = parameters.Select(x => x.Clone()).ToArray();

public static class Extension
{
    public static SqlParameter Clone(this SqlParameter @this)
    {
        var destination = new SqlParameter();

        var copyToMethod = typeof (SqlParameter).GetMethod("CopyTo", BindingFlags.Instance | BindingFlags.NonPublic, null, new[] {typeof (DbParameter)}, null);
        copyToMethod.Invoke(@this, new[] {destination});

        return destination;
    }
}