Как я могу запросить базу данных SQL Server со списком параметров в Dapper? - PullRequest
0 голосов
/ 11 марта 2019

У меня есть список объектов с различными свойствами.Я хочу запросить базу данных, используя эти свойства, и получить список результатов обратно.

Это то, что я пробовал:

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 параметров.Сократите количество параметров и повторно отправьте запрос.

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 12 марта 2019

Благодаря предложению @ 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;
    }
}
...