如何使用 CreateCriteria
查询简单类型的集合?
比如我有1个类(class)
public class Test
{
public virtual Guid Id { get; set; }
private ICollection<int> _values = new HashedSet<int>();
public virtual ICollection<int> Values
{
get { return _values; }
}
}
还有 2 个表来支持它:
- 仅使用 1 列进行测试:Id
- 具有 2 列的值:TestId 和 Value
我的目标是使用 CreateCriteria
重写以下查询:
select * from test t
inner join values v on v.TestId = t.Id
where v.Value = 10
我试过这个:
Session.CreateCriteria<Test>("test")
.CreateAlias("test.Values", "values")
.Add(Restrictions.Eq("values", 10))
.List();
就像我会用一组对象来完成它,但显然失败了。加入是正确的,但如何添加限制?
最佳答案
尽管有这个问题,我还是建议使用 IList<ValueEntity>
而不是 IList<int>
.
嗯,只有当包含值 ([dbo].[values]) 的表可以有自己的替代 ID 列时,这才会起作用。 IE。这些列:ID
, TestId
, Value
我们可以引入新实体 ValueEntity 并将其映射为一级公民。然后查询它会变得更加简单,包括子查询..
但我知道这不是这里的问题。
事实上,有一个解决方案,上面的问题有答案。但是,请至少尝试考虑上述建议...
NHibernate 解决方案IList<int>
集合查询是:
Session.CreateCriteria<Test>("test")
.CreateAlias("test.Values", "values")
// we add magic keyword ".elements" here
.Add(Restrictions.Eq("values.elements", 10))
.List();
请参阅“.elements”,它的记录有点不正确 here .还提供了这个类似问题的答案:NHibernate How do I query against an IList<string> property?
关于c# - 在简单类型的集合上创建条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26750751/