linq(至nHibernate):“喜欢输入"运算符 [英] linq (to nHibernate): 'like in' operator

查看:121
本文介绍了linq(至nHibernate):“喜欢输入"运算符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


给定一个字符串列表,我想检索名称包含给定字符串之一的所有项目.
例如,给定{"foo","kuku"},我想检索员工"Corfoo","kuku maluku"和"kukufoo".
我尝试了以下操作,但是有一个空引用异常(?)

Hi
Given a list of strings I want to retrieve all items whose names contain one of the given strings.
for example- given {"foo", "kuku"} I want to retrieve the employees "Corfoo", "kuku maluku" and "kukufoo".
I've tried the following, but got a null-reference exception(?)

query.Where(u => values.Any(v=> u.FullName.Contains(v)) );

以下内容产生了"Lambda表达式不在范围内"异常.

The following produced a 'Lambda expression not in scope' exception.

query.Where(u => (values.Count(v => u.FullName.Contains(v)) > 0) );

知道如何做到这一点吗?
我一直在考虑遍历值集合并为每个元素添加新条件的思路.
问题是-.Where()函数是一个连词(AND),而我需要析取(OR)...
(我在Linq provider上使用nH 2.1.2;尚未在nH3.0上尝试过此方法...)

any idea how this can be done?
I was thinking along the lines of iterating over the values collection and adding a new condition for each element.
problem is- the .Where() function is a conjunction (AND) and I need disjunction (OR)...
(I'm using nH 2.1.2 with Linq provider; hadn't tried this on nH3.0 yet...)

推荐答案

如果您不仅限于Linq提供程序,而且还可以使用ICriteria API,则建议使用以下内容:

If you are not limited to the Linq provider but also open to the ICriteria API, I suggest using the following:

List<string> fullnames = new List<string>() { "foo", "kuku" };
// prepare Query
var query = session.CreateCriteria(typeof(Employee));
// dynamically add Like-conditions combined with OR
Disjunction namesCriteria = Restrictions.Disjunction();
foreach (var name in fullnames)
{
    namesCriteria.Add(Restrictions.Like("FullName", name, MatchMode.Anywhere));
}
// add complete Disjunction to prepared query
query.Add(namesCriteria);
IList<Employee> list = query.List<Employee>();

我认为在NHibernate.Linq中尝试该操作可能会更难,即使不是不可能.在NH 3.0中,您可以使用QueryOver,它可以摆脱魔术字符串.

I think trying that in NHibernate.Linq might be harder if not impossible. With NH 3.0 you could use QueryOver, which would get rid of the magic strings.

这篇关于linq(至nHibernate):“喜欢输入"运算符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆