【问题标题】:NHibernate 5 Criteria must use equivalent of LINQ .Contains()NHibernate 5 Criteria 必须使用等效的 LINQ .Contains()
【发布时间】: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 =&gt; new ClockEntry() { Id = c.Id, Time = c.Time}) 应该适用于 Query
  • 感谢@Roman - 这证实了 Select 能够将查询转换为仅保留 Id 和 Time 元素的结果。我找到了 ICriteria 示例的答案。

标签: nhibernate nhibernate-criteria


【解决方案1】:

一旦我发现在 SQL 中这将是一个 IN 构造,我设法解决了 Icriteria 查询“p”和“s”项目,因此它变成了:

var list = session.CreateCriteria(typeof(ClockEntry))
    .Add(Restrictions.Ge("Time", strtDate))
    .Add(Restrictions.Le("Time", entDate))
    .Add(Restrictions.In("PayrollNo", p))
    .Add(Restrictions.In("SiteCode", s))

    .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]});
            
return list.ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多