- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
背景,使用 FluentNHibernate,使用 NHibernate 3.0 的最新开发版本。
这是 WorkIncident 的类型声明:
// Enumeration used in class below.
public enum TicketStatus
{
Open = 1,
Closed = 10,
Hold = 20
}
// Ticket class.
public class WorkIncident
{
public virtual int EntryId { get; set; }
public virtual int TicketNumber { get; set; }
public virtual string ModifierNtId { get; set; }
public virtual DateTime ModifiedDate { get; set; }
public virtual TicketStatus Status { get; set; }
public virtual int Version { get; set; }
public virtual string Title { get; set; }
public virtual string Details { get; set; }
}
// FluentNHibernate mapping
public class WorkIncidentMap : ClassMap<WorkIncident>
{
public WorkIncidentMap()
{
Table("incident_details");
Id( wi => wi.EntryId, "wiid");
Map(wi => wi.TicketNumber, "workitem_number");
Map(wi => wi.Title, "workitem_title");
Map(wi => wi.Details, "workitem_comment");
Map(wi => wi.ModifiedDate, "workitem_modified_on");
Map(wi => wi.ModifierNtId, "modified_by_worker_nt_id");
Map(wi => wi.Status, "workitem_status_lookup_id").CustomType<EnumType<Status>>();
Map(wi => wi.Version, "workitem_version");
}
}
映射工作正常,我可以毫无问题地进行如下查询:
session.QueryOver<AltirisIncident>()
.Where(ai => ai.ModifierNtId == worker.Name.Replace("\\", @"\"))
.AndRestrictionOn(ai => ai.ModifiedDate)
.IsBetween(DateTime.Today)
.And(DateTime.Today.AddDays(1))
.List<WorkIncident>();
这为我提供了特定用户在当前日期触及的所有工作项(基本上是帮助台故障单)。
但是,我一直无法将以下 HQL 翻译成流畅的声明:
from WorkIncident as t1
where t1.ModifierNtId = :ntid
and t1.ModifiedDate between :startdate and :enddate
and t1.Status = :status
and (t1.Version = 1
or t1.TicketNumber in (
select t2.TicketNumber
from WorkIncident as t2
where t2.Status != t1.Status
and t2.TicketNumber = t1.TicketNumber
and t2.Version = t1.Version - 1))
此查询为我提供了由工作人员置于关闭状态的所有工作项的列表。考虑到工单在数据库中的存储方式(每张工单有多个记录(每次更新一个记录)并且主管通常会在工作人员关闭工单后向工单添加注释,导致我无法只查看工单的情况具有关闭状态的最后版本号,可以可靠地告诉我谁关闭了工单。
任何帮助将不胜感激,因为我更愿意尽可能地远离 HQL 和魔术字符串。
最佳答案
我认为这应该可以解决问题。困难的部分是真正处理你在那里的数学运算。你必须进入 SQLFunction 预测
session.QueryOver<WorkIncident>(() => t1Alias)
.Where(w => w.ModifierNtId == "test")
.And(w => w.ModifiedDate < DateTime.Now && w.ModifiedDate > DateTime.Now)
.And(w => w.Status == TicketStatus.Open)
.And(Restrictions.Disjunction()
.Add(Restrictions.Where<WorkIncident>(w => w.TicketNumber == 1))
.Add(Subqueries.WhereProperty(() => t1Alias.TicketNumber).In(
QueryOver.Of<WorkIncident>(() => t2Alias)
.Where(() => t2Alias.Status != t1Alias.Status)
.And(() => t2Alias.TicketNumber == t1Alias.TicketNumber)
.And(Restrictions.EqProperty(
Projections.Property<WorkIncident>(w=> w.Version),
Projections.SqlFunction(
new VarArgsSQLFunction("(","-",")"),
NHibernateUtil.Int32,
Projections.Property(()=> t1Alias.Version),
Projections.Constant(1)
)))
.Select(w => w.TicketNumber)))
).List();
在我的测试中,这生成了以下 SQL
SELECT <snip...>
FROM incident_details this_
WHERE this_.modified_by_worker_nt_id = @p0
and (this_.workitem_modified_on < @p1 and this_.workitem_modified_on > @p2)
and this_.workitem_status_lookup_id = @p3
and (this_.workitem_number = @p4
or this_.workitem_number in
(SELECT this_0_.workitem_number as y0_
FROM incident_details this_0_
WHERE not (this_0_.workitem_status_lookup_id = this_.workitem_status_lookup_id)
and this_0_.workitem_number = this_.workitem_number
and this_0_.workitem_version = (this_.workitem_version-@p5)));
@p0 = 'test' [Type: String (0)], @p1 = 10/26/2012 11:26:24 PM [Type: DateTime (0)], @p2 = 10/26/2012 11:26:24 PM [Type: DateTime (0)], @p3 = 1 [Type: Int32 (0)], @p4 = 1 [Type: Int32 (0)], @p5 = 1 [Type: Int32 (0)]
关于c# - NHibernate fluent (QueryOver) 用相关子查询替换 HQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5384144/
我有以下疑问: Model.RampActiveHour rah = null; var defaultWeekQuery = QueryOver.Of()
为了保持我的查询独立并可能重用,我倾向于在 NH2 中这样做: public class FeaturedCarFinder : DetachedCriteria { public Featu
我正在尝试在 queryover 调用中解耦 orderby,但这无法编译 protected static void AddOrder(IQueryOver criteria, Expression
我在 Nhibernate QueryOver 中有一个查询,它带回了一组剧集对象(剧集是一个护理咒语),这些对象又具有一组剧集状态作为每个剧集的属性。但是我想改变这一点,以便每一集只带回该集的最新状
假设我有三个简单的表 schedule { Student student { get; set;} Teacher teacher { get; set;} bool Del
我有一个小问题:我会在我的 QueryOver 中插入一个条件来检查变量值。像这样: var qOver = QueryOver.Of(() => myMod) .J
如何通过字符串属性的长度限制查询?例如。就像是: NHSession.QueryOver() .Where(p => p.RegistryCode.Length == 8) 最佳答案 像这样的
尝试使用 QueryOver 和标记的枚举查询。这适用于 Nhibernate.Linq: var results = repo.Query() .Where(x => (x.Classifica
我正在尝试使用 QueryOver 从数据库更新记录. 我的代码最初创建一个实体并保存在数据库中,然后在数据库外部更新相同的记录(来自其他程序,手动或在其他机器上运行的相同程序),当我调用 query
我想要做的是显示一个简单的数据网格,其中包含实体数据及其子项的聚合数据。例如,让我们使用订单和订单项。我想显示订单信息和订单项的数量。 订单 ID、订单日期、NumOfLineItems 现在通常在
我想用 QueryOver 编写这样一个查询,以便结果 SQL 将类似于以下内容: Select Bar, count(*) from Foo group by Bar having count(*)
我想模拟这个查询: SELECT * FROM FOO WHERE ID IN (1,2,3) 我怎样才能在 FNH 中做到这一点? var ids = new List{1,2,3}; var re
我正在尝试从我的 User 对象中加载多对多集合中的角色。 Role role = null; IQueryOver query = session.QueryOver()
我有以下使用子查询的 NHibernate 查询: NHContext.Session.QueryOver() .WithSubquery.WhereProperty(x =>
我有这个 设想: class User { Id, UserName } class UserRelationship { User GroupUser, User MemberUser } and
我在投影 sql Coalesce 函数时遇到了 nhibernate 问题。 我正在比较来自两个不同实体的两个具有相同名称的字符串属性。在生成的 SQL 中,仅比较第一个实体的相同属性,如下所示:
StackOverflow 用户您好, 我遇到了这个问题我有三个 QueryOver,每个都返回一个候选 id 列表,然后我用它来引入这些候选。为此我编写了以下代码。 private
如何使用 QueryOver 重写此 SQL?我不确定 QueryOver 的连接优先级和解析是如何工作的。 SELECT DISTINCT T1.* FROM T1 LEFT JOIN T2
我的类(class)的简单示例: public class Post { public IEnumerable Tags { get; set; } } 用户检查一些感兴趣的标签来过滤帖子列表
考虑这个人为的域: namespace TryHibernate.Example { public class Computer { public int Id { get; set; }
我是一名优秀的程序员,十分优秀!