【发布时间】:2022-01-24 15:05:31
【问题描述】:
我们有一个 NHibernate V5 项目,其中一些查询需要改进。 我们有一个使用 ICriteria 的查询,如下所示:
var list = session.CreateCriteria(typeof(ClockEntry))
.Add(Restrictions.And(
Restrictions.Ge("Time", startDate),
Restrictions.Le("Time", endDate)
))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Id"))
.Add(Projections.Property("Time"))
)
.List<IList>()
.Select(ce => new ClockEntry() { Id = (Guid)ce[0], Time = (DateTime)ce[1] });
最后一行代码(Select)创建了一个新的 ClockEntry 列表,其中只有 Id 和 Time 保留值。所有其他字段(列)为空。
然后我们使用 NHibernate Query 编写了一个新查询,其中添加了“包含”元素。 如下:
var p = Rules.UserDataFilters.UserPayrollFilterNumbers(user, session, false);
var s = Rules.UserDataFilters.UserSiteFilterCodes(user, session);
ClockEntryRepository clockEntryRepository = new ClockEntryRepository(session);
var r = clockEntryRepository
.Query()
.Where(c =>
c.Time >= startDate &&
c.Time <= endDate &&
p.Contains(c.Employee.Payroll.Number) &&
s.Contains(c.Employee.Site.Code));
注意添加的“p”和“s”约束
问题: 我找不到将“包含”添加到第一个代码块中的正确结构 而且我无法找到一种优雅的方式来实现第二个示例中的 Select 语句。 显然,任何一个都可以,但我非常感谢为这两种情况提供答案。
【问题讨论】:
-
.Select(c => new ClockEntry() { Id = c.Id, Time = c.Time})应该适用于Query -
感谢@Roman - 这证实了 Select 能够将查询转换为仅保留 Id 和 Time 元素的结果。我找到了 ICriteria 示例的答案。
标签: nhibernate nhibernate-criteria