繁体   English   中英

如何使用 Dapper 中的参数列表查询 SQL Server 数据库?

[英]How do I query a SQL Server database with a list of parameters in Dapper?

我有一个具有各种属性的对象列表。 我想使用这些属性查询数据库并返回结果列表。

这是我尝试过的:

public async Task<IEnumerable<Animal>> GetAnimalsFromAttributesAsync(IEnumerable<AnimalInfo> attributeSets)
{
    using (var myDB = new SqlConnection(connectionString))
    {
        await myDB.OpenAsync();
        var results = new List<Animal>();

        foreach (var attributeSet in attributeSets)
        {
            var sql = @"select AnimalID, AnimalTypeID, AnimalColor
                        from Animals
                        where AnimalTypeID = @AnimalTypeID 
                          and AnimalColorID = @AnimalColorID";

            var result = myDB.Query<Animal>(sql, attributeSet);
            results.AddRange(result);
        }

        return results
    }
}

这适用于少量属性。 但是如果我有很多属性,那么我会收到这个错误:

错误:传入的请求参数过多。 服务器最多支持 2100 个参数。 减少参数数量并重新发送请求。

有一个更好的方法吗?

感谢@MarcGravell 的建议,我决定将我的查询重写为 TVP 查询。

查询语句:

create type AnimalInfo as table
( 
    AnimalTypeID int,
    AnimalColorID int
)
go  

C#:

public async Task<IEnumerable<Animal>> GetAnimalsFromAttributesAsync(DataTable attributeSets)
{
    using (var myDB = new SqlConnection(connectionString))
    {
        await myDB.OpenAsync();

        var sql = @"select AnimalID, AnimalTypeID, AnimalColor
                    from Animals
                    inner join @animalInfos animalInfos on 
                        animalInfos.AnimalColorID = Animals.ColorID 
                            and 
                        animalInfos.AnimalTypeID = Animals.AnimalTypeID";

        var result = await myDB.QueryAsync<Animal>(sql, new { animalInfos = attributeSets.AsTableValuedParameter("AnimalInfo") };

        return result;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM