如何使用Linq到NHibernate执行执行时间查询

如何使用Linq到NHibernate执行执行时间查询,nhibernate,fluent-nhibernate,linq-to-nhibernate,Nhibernate,Fluent Nhibernate,Linq To Nhibernate,我正在向表中插入一条记录,但我希望能够设置 插入上的排序器字段以从类别中选择最大值(排序器)+1 其中SiteID=@SiteID。最简单的方法是什么 这是我的数据结构: 类别 ID 站点ID 排序器 名字 我正在使用Fluent NHibernate和Linq到NHibernate。谢谢你的帮助 好的,这里有两种方法。最简单的可能不涉及NHibernate,因为您正在使用SQL Server。。。您可以在表上创建一个INSERT而非INSERT触发器,如下所示: CREATE TRIGGER

我正在向表中插入一条记录,但我希望能够设置 插入上的排序器字段以从类别中选择最大值(排序器)+1 其中SiteID=@SiteID。最简单的方法是什么

这是我的数据结构:
类别
ID
站点ID
排序器
名字


我正在使用Fluent NHibernate和Linq到NHibernate。谢谢你的帮助

好的,这里有两种方法。最简单的可能不涉及NHibernate,因为您正在使用SQL Server。。。您可以在表上创建一个INSERT而非INSERT触发器,如下所示:

CREATE TRIGGER tgINSCategory ON Category INSTEAD OF INSERT
AS 
BEGIN
    SET NOCOUNT ON

    INSERT INTO Category (SiteID, Name, SortOrder)
    SELECT SiteID, Name, 
        ISNULL((SELECT MAX(c.SortOrder)
                FROM Category c INNER JOIN INSERTED i ON c.SiteID = i.SiteID), 0) + 1   
    FROM INSERTED
END
在第一个场景中,您只需将NHibernate映射为只读的SortOrder列(只需在fluent NHibernate类映射SortOrder属性上添加一个.ReadOnly()

第二种方法是使用NHibernate的内置特性,称为拦截器。使用拦截器,您可以在NHibernate正常生成SQL以执行DML操作的时候运行您喜欢的任何代码。下面的自动插入创建信息,但将非常类似于您所需要的。IInsertLoggable是一个自定义接口,它只列出了侦听所需的属性/列

using System;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;

    public class InsertDefaults : EmptyInterceptor {
        private const string CREATED_BY = "CreatedById";

        private Hashtable GetInsertLoggablePropertyIndexes(string[] Properties) {
            Hashtable result = new Hashtable();
            for (int i = 0; i < Properties.Length; i++) {
                if (Properties[i] == CREATED_BY) {
                    result.Add(CREATED_BY, i);
                    break;
                } 
            }
            return result;
        }

        public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types) {
            if (entity is IInsertLoggable) {  
                Hashtable indexes = GetInsertLoggablePropertyIndexes(propertyNames);
                state[(int)indexes[CREATED_BY]] = currentUser;
                PropertyInfo createdByProp = entity.GetType().GetProperty(CREATED_BY);
                if (createdByProp != null)
                    createdByProp.SetValue(entity, currentUser, null);
            }
            return base.OnSave(entity, id, state, propertyNames, types);
        }
    }
使用系统;
运用系统反思;
使用系统集合;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用NHibernate;
公共类InsertDefaults:EmptyInterceptor{
“CreatedById”创建的私有常量字符串;
私有哈希表GetInsertLogGablePropertyIndex(字符串[]属性){
Hashtable result=新的Hashtable();
for(int i=0;i

在我看来,这种经典的触发器操作应该存在于数据库中,我会选择第一个选项…

数据库是什么?在SQL中,您只需将该列设置为自动递增列,您所描述的默认情况下就会发生。其他数据库服务器也做类似的事情。实现这一点不需要任何代码。在insert时,您不提供排序器的值。它是SQL Server,但表中有子集,这就是我按SiteID筛选的原因。