问题:Nhibernate解析"WHERE IN()"sql中的每个值作为参数,MS SQL服务器不支持足够的参数(超过2000).
我正在使用Nhibernate和Linq来从SQL服务器中检索我的数据,我需要根据已知的ID加载很多实体.
我的代码看起来像这样:
int[] knownIds = GetIDsFromFile();
var loadedEntities = _Repository.GetAll()
.Where(x => knownIds.Contains(x.ID))
.ToList();
Run Code Online (Sandbox Code Playgroud)
哪个给出这样的sql:
SELECT id, name FROM MyTable
WHERE id IN (1 /* @p0 */,2 /* @p1 */,3 /* @p2 */,4 /* @p3 */, 5 /* @p4 */)
Run Code Online (Sandbox Code Playgroud)
如果knownIds中的值太多,那么这段代码将抛出异常,因为NHibernate使用了许多参数.
我认为最好的解决方案是如果我能让NHibernate只为整个"WHERE IN()"使用1个参数,但我不知道如何做到这一点:
SELECT id, name FROM MyTable WHERE id IN (1, 2, 3, 4, 5 /* @p0 */)
Run Code Online (Sandbox Code Playgroud)
我很高兴听到有关如何解决这个问题的任何想法 - 通过扩展LINQ提供程序或通过其他方式.一个解决方案是简单地执行查询x次(knownIds.Count/1000),但我更想要一个适用于我所有实体的通用解决方案.
我试图通过搜索谷歌和Stackoverflow来扩展LINQ提供程序,但我找不到解决方案,我没有任何经验与HQL或treebuilder.这里有一些我去过的网站:
更新:
我知道在IN子句中有这么多的值是不好的做法,但我不知道我想要做的更好的解决方案.
考虑一家公司,每个月,所有客户都会为公司的服务付费一次.该公司本身不处理付款,但有另一家公司来收钱.公司每个月都会收到一个包含这些付款状态的文件:如果已付款或未付款.该文件仅包含特定付款的ID,而不包含客户的ID.一家拥有3000名月度客户的公司每月将进行3000次LogPayments,其状态需要更新.1年后将会有大约36,000个LogPayments,所以加载它们似乎也不是一个好的解决方案.
我的解决方案: …