# 將集合傳至 SQL Server 中查詢
### 簡單型別集合
- 以下範例已在 DataBase [dbo].[TestDto] 加上測試資料
#### Dapper
- 目前似乎只支援轉成 `(value1, value2, ...)` 這樣型式的語法
```csharp
public TestDto[] Simple(int[] ints)
{
var sql = @"
SELECT *
FROM [dbo].[TestDto]
WHERE Id IN @Ints
";
var param = new DynamicParameters();
param.Add("@ints", ints);
var result = _sqlConnection.Query<TestDto>(sql, param).ToArray();
return result;
}
```
實際執行的 SQL
```sql
exec sp_executesql N'
SELECT *
FROM [dbo].[TestDto]
WHERE Id IN (@Ints1,@Ints2)
',N'@ints1 int,@ints2 int',@ints1=1,@ints2=2
```
#### Entity Framework Core
```csharp
public TestDto[] Simple(int[] ints)
{
var result = _testDbContext.TestDtos
.Where(dto => ints.Contains(dto.Id))
.ToArray();
return result;
}
```
實際執行的 SQL
```sql
SELECT [t].[Id], [t].[Name]
FROM [TestDto] AS [t]
WHERE [t].[Id] IN (1, 2)
```
---
### 複雜型別集合
就是以 Table Valued Parameter 方式傳入至 SQL Server 中,傳入後,就是 User Defined Table Types !
- ToDataTable() 這個 Extension Method 就是將 IEnumerable\<T> 轉為 DataTable
- 以下範例就是把 DataTable 傳至 DataBase 再進行查詢,將整個資料表回傳 !
#### Dapper
範例:
- AsTableValuedParameter() 引數就是給定 SQL Server 中的 User Defined Table Types
```csharp
public TestDto[] Complicated(TestDto[] dtos)
{
var sql = @"
SELECT *
FROM @tables
";
var param = new DynamicParameters();
param.Add("@tables", dtos.ToDataTable().AsTableValuedParameter("[dbo].[ut_TestDto]"));
var result = _sqlConnection.Query<TestDto>(sql, param).ToArray();
return result;
}
```
實際執行的 SQL
```sql
declare @p3 dbo.ut_TestDto
insert into @p3 values(1,N'A')
insert into @p3 values(2,N'B')
insert into @p3 values(3,N'C')
exec sp_executesql N'
SELECT *
FROM @tables
',N'@tables [dbo].[ut_TestDto] READONLY',@tables=@p3
```
#### Entity Framework Core
```csharp
public TestDto[] Complicated(TestDto[] dtos)
{
var sql = @"
SELECT *
FROM @tables
";
var param = new SqlParameter("@tables", dtos.ToDataTable())
{
TypeName = "[dbo].[ut_TestDto]",
SqlDbType = SqlDbType.Structured
};
var result = _testDbContext.TestDtos.FromSqlRaw(sql, param).ToArray();
return result;
}
```
實際執行的 SQL
```sql
declare @p3 dbo.ut_TestDto
insert into @p3 values(1,N'A')
insert into @p3 values(2,N'B')
insert into @p3 values(3,N'C')
exec sp_executesql N'
SELECT *
FROM @tables
',N'@tables [dbo].[ut_TestDto] READONLY',@tables=@p3
```