如何使用Dapper提供v。大WHERE子句

时间:2018-11-14 22:04:37

标签: c# sql dapper

我正努力在网上找到答案,因此请原谅我缺乏研究,直接回答了眼前的问题。

我正在使用dapper在C#中建立以下查询;

vm

当前,我有一个私有函数,该函数接受列和值的键值列表,并将其转换为一堆where子句。例如;

SELECT BookName
FROM dbo.Books
WHERE {predicates}

这将被转换为;

var searchTerms = new List<KeyValuePair<string, string>>{
    new KeyValuePair("ReferenceId", "42"),
    new KeyValuePair("AuthorId", "1")
};

这是可行的,它是“确定”。

眼前的问题

用户可以并且已经输入了10,000个ID。 UI和服务器在处理此问题上没有问题,但是SQL Server对我不满意,我得到以下信息;

  

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

现在,我知道此限制存在,并且在使用SELECT BookName FROM dbo.Books WHERE ReferenceId = 41 AND AuthorId = 1 语句时也知道该限制存在。问题是,我该如何解决?

我的第一个想法是传递json并将查询更改为类似的内容

IN

据我所知,此解决方案可行,但考虑到我的原始情况,如果用户粘贴10'000 Author ID,该怎么办。

我希望至少有一个响应是“只需查询”,我希望这是可能的。我们正在谈论的是一个1300万行表,其中包含20多个列,其中大多数对于某人来说很重要。

我想要一个优雅的解决方案...

理想情况下,我不确定这是否可能...

我很想将数据作为json传入并填充以下声明的表;

SELECT BookName
FROM dbo.Books
WHERE ReferenceId IN (
    SELECT UpcId FROM OPENJSON(@json) WITH(UpcId bigint '$')
)

现在我知道如何填充此表,但是我绝对不知道是否可以创建一个查询来将这些值用作列并在优雅的查询中生成等效的where子句!

0 个答案:

没有答案