【发布时间】:2014-05-08 14:23:31
【问题描述】:
我正在尝试使用 SQL 函数来过滤查询结果。我在 SQL 中有一个名为 SplitKeys 的函数,它接受一个 csv 字符串并返回一个整数表。我想生成以下 SQL(或接近它):
select * from Members where MemberKey in (select * from SplitKeys('1,2,3'))
我正在使用 QueryOver,但似乎无法生成该 where 子句。由于我无法让它工作,我创建了另一个函数,它接受一个字符串和 id,如果它在列表中,则返回 id,否则返回 -1。
session.QueryOver<Member>().Where(
Restrictions.Ge(
Projections.SqlFunction(
"dbo.IsKeyInList",
NHibernateUtil.StringClob,
new[]
{
Projections.Constant(
keyList,
NHibernateUtil.StringClob),
Projections.Constant(',', NHibernateUtil.Character),
Projections.Property<Member>(x => x.MemberKey)
}),
0));
这很好用,只是速度很慢。对于第一个查询,该函数被调用一次,然后它可以根据表进行过滤。在第二个中,它为每一行调用该函数。
我最初将其作为整数列表并将其传入。但是,问题在于列表中的每个元素都是 SQL 中的一个参数,最大参数是 2100。
session.QueryOver().WhereRestrictionOn(x => x.MemberKey).IsInG(intKeyList);
我看了又看,似乎无法找到这样做的人或让 NHibernate 和 C# 编译器喜欢它。我试过这个,但它不起作用。此变体和其他变体要么引发 System.In32 的无映射异常,要么不返回任何内容。
var keys =
session.QueryOver<MemberKey>()
.Select(
Projections.SqlFunction(
"dbo.SplitKeysCSV",
NHibernateUtil.StringClob,
new[] {
Projections.Constant(keyList),
Projections.Constant(delimiter),
}));
我尝试为结果创建某种映射,但我不能这样做,因为没有表格。我尝试使用 .In() 函数,但它不接受 Projects.SqlFunction。
【问题讨论】:
标签: c# mysql sql sql-server nhibernate