LINQ中的IsNull或合并功能?
我有以下LINQ查询:LINQ中的IsNull或合并功能?,linq,nhibernate,Linq,Nhibernate,我有以下LINQ查询: return (from r in Repository.Query<Measurement>() where r.Postal.ToLowerInvariant() == (string.IsNullOrEmpty(postalCode) ? r.Postal : postalCode).ToLowerInvariant()
return (from r in Repository.Query<Measurement>()
where
r.Postal.ToLowerInvariant() ==
(string.IsNullOrEmpty(postalCode)
? r.Postal : postalCode).ToLowerInvariant()
&&
r.Trait.ToLowerInvariant() ==
(string.IsNullOrEmpty(trait)
? r.Trait : trait).ToLowerInvariant()
select r).ToList();
就这样。没有更多关于我做错了什么的线索。帮忙
编辑:当我查询内存中的对象列表时,此查询起作用。当我移动到NHibernate对db执行时,我就开始出现异常。尝试重构IsNullOrEmpty条件,如下所示:
return (from r in Repository.Query<Measurement>()
where
(string.IsNullOrEmpty(postalCode)
|| r.Postal.ToLowerInvariant() == postalCode.ToLowerInvariant()
)
&&
(string.IsNullOrEmpty(trait)
|| r.Trait.ToLowerInvariant() == trait.ToLowerInvariant()
)
select r).ToList();
返回(来自Repository.Query()中的r)
哪里
(string.IsNullOrEmpty(postalCode)
||r.Postal.ToLowerInvariant()==postalCode.ToLowerInvariant()
)
&&
(string.IsNullOrEmpty(trait)
||r.Trait.ToLowerInvariant()==Trait.ToLowerInvariant()
)
选择r.ToList();
这可能会导致LINQ在发送查询之前计算IsNullOrEmpty。如果没有,您可以手动预先计算它们,并在它们的位置放置一对布尔变量。您是否尝试过在where子句之前调用
Repository.Query().ToList()
来强制延迟执行?我注意到NHibernate似乎正在尝试将string.IsNullOrEmpty()
调用转换为SQL语法(但失败)
return(从Repository.Query().ToList()中的r返回)
哪里
r、 邮政编码:ToLowerInvariant()==
(string.IsNullOrEmpty(postalCode)
r.邮政编码:postalCode).ToLowerInvariant()
&&
r、 Trait.ToLowerInvariant()==
(string.IsNullOrEmpty(trait)
?r.特征:特征)。ToLowerInvariant()
选择r.ToList();
您可以发布堆栈跟踪吗?我看不出一元运算符“Not”在何处被使用。如果删除对ToLowerInvariant()
的调用,是否仍会出现错误?如果您确定测量值不会超过100左右,您可以在内存中对其进行筛选。这是不受支持的,但从技术上讲,编写支持它的代码并将其作为NHiberante的补丁提交并不难。@Paco,如果我确切知道堆栈跟踪的含义,我可能会被迫尝试,但我对LINQ表达式的本质一无所知,而且我真的没有时间成为它们的专家。
return (from r in Repository.Query<Measurement>()
where
(string.IsNullOrEmpty(postalCode)
|| r.Postal.ToLowerInvariant() == postalCode.ToLowerInvariant()
)
&&
(string.IsNullOrEmpty(trait)
|| r.Trait.ToLowerInvariant() == trait.ToLowerInvariant()
)
select r).ToList();
return (from r in Repository.Query<Measurement>().ToList()
where
r.Postal.ToLowerInvariant() ==
(string.IsNullOrEmpty(postalCode)
? r.Postal : postalCode).ToLowerInvariant()
&&
r.Trait.ToLowerInvariant() ==
(string.IsNullOrEmpty(trait)
? r.Trait : trait).ToLowerInvariant()
select r).ToList();