【发布时间】:2016-05-13 14:29:08
【问题描述】:
好的,好久不见,第一次来电。
我正在尝试使用 QueryOver API 编写一个查询,该 API 将在我的实体的某些属性中搜索多个术语。问题是其中一些属性是对另一个实体的引用;但是,我仍然需要在该引用的属性中搜索给定的术语。
我希望能够编写类似于以下代码的内容。在下面的代码中,FirstName、MiddleName 和 LastName 都是 Person 实体上的基本字符串属性。 Department 属性是 Department 类型的引用属性。 Department 实体具有三个属性:Id、Value、Description。 Person.Department.Value 还必须与基本属性一起搜索给定术语。
var queryOver = session.QueryOver<Person>();
foreach (string term in searchTerms)
{
queryOver = queryOver.Where(Restrictions.On<Person>(x => x.FirstName).IsInsensitiveLike(term, MatchMode.Anywhere) ||
Restrictions.On<Person>(x => x.LastName).IsInsensitiveLike(term, MatchMode.Anywhere) ||
Restrictions.On<Person>(x => x.MiddleName).IsInsensitiveLike(term, MatchMode.Anywhere) ||
//This following line doesn't work.
Restrictions.On<Person>(x => x.Department.Value).IsInsensitiveLike(term, MatchMode.Anywhere)
}
我尝试过使用别名和 NHibernate.Linq/Query API。我知道我需要使用别名进行某种连接,但我想我不理解我读过的所有问题/文章。他们中的大多数人似乎都在谈论对 Reference 或 Child 进行查询/子查询,但我在将这些查询转换为与其他属性一起的查询并将它们全部进行 OR 运算时遇到了问题。
我要争取的最终 SQL 是这样的:
SELECT *
FROM `persons`
WHERE (`FirstName` LIKE '%term1%' OR
`LastName` LIKE '%term1%' OR
`MiddleName` LIKE '%term1%' OR
`Department`.`Value` LIKE '%term1%') AND //I know this won't work
(`FirstName` LIKE '%term2%' OR
`LastName` LIKE '%term2%' OR
`MiddleName` LIKE '%term2%' OR
`Department`.`Value` LIKE '%term2%') AND etc...
最后,非常感谢您的帮助。如果您认为我可以通过不同的查询获得相同的结果,我愿意在 NHibernate 中使用不同的 API,甚至使用不同的搜索策略。
【问题讨论】:
标签: c# nhibernate queryover