c# - 如何使用 Dapper 中的参数列表查询 SQL Server 数据库?
问题描述
我有一个具有各种属性的对象列表。我想使用这些属性查询数据库并返回结果列表。
这是我尝试过的:
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 查询。
SQL:
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;
}
}
推荐阅读
- wpf - 在 wpf 中仅使用 xaml 代码创建数字时钟
- python-3.x - Jenkins 管道:运行 python 脚本
- php - 如何根据 PHP 中数组上的邻居特定键创建数组
- spring - 如何处理 Quartz Scheduler 中的失火触发器?
- wordpress - 当自定义字段中有多个值时如何编写wordpress查询
- javascript - 如何删除特定的
- 特定的
- 从几个列表中
- s
- 特定的
- excel - 在 VBA Excel 中使用范围方法时出错(参数设置)
- c++ - 如何刷新 hls::Mat?
- java - 如何使用spring boot security从facebook获取访问令牌
- react-native - 无法读取从clevertap 仪表板发送的推送通知的有效负载