Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate-使用基类进行查询?_Nhibernate_Criteria Api_Queryover - Fatal编程技术网

NHibernate-使用基类进行查询?

NHibernate-使用基类进行查询?,nhibernate,criteria-api,queryover,Nhibernate,Criteria Api,Queryover,现在我正在使用Criteria API并喜欢它,但如果我能切换到QueryOver API,那就更好了。然而,我的设置有点奇怪。为了将数据划分到表中,我有一个基本抽象类: Listing 以及从中继承的许多类: Listing_UK Listing_US etc. 使用criteria API,我可以执行以下操作: Type t = typeof(Listing_UK); if (condition) t = typeof(Listing_US); DbSession.CreateCrite

现在我正在使用Criteria API并喜欢它,但如果我能切换到QueryOver API,那就更好了。然而,我的设置有点奇怪。为了将数据划分到表中,我有一个基本抽象类:

Listing
以及从中继承的许多类:

Listing_UK
Listing_US
etc.
使用criteria API,我可以执行以下操作:

Type t = typeof(Listing_UK);
if (condition) t = typeof(Listing_US);
DbSession.CreateCriteria(t)
            .Add(Restriction.Eq("field",value)
            .List<Listing>());
Type t=typeof(英国清单);
if(condition)t=typeof(列表_-US);
DbSession.CreateCriteria(t)
.Add(限制.Eq(“字段”,值)
.List());
基本上,在不同的类上使用相同的查询。QueryOver的强类型特性似乎阻止了我这样做——基本问题是:

DBSession.QueryOver<Listing_UK>()
DBSession.QueryOver()
不投

DBSession.QueryOver<Listing>
DBSession.QueryOver

虽然我知道为什么,但我想知道是否有人有什么技巧可以让我创建一个仍然以正确的表为目标的通用查询器?

您可能会发现可以使用以下重载:

DbSession.CreateCriteria(myDynamicallyDeterminedType)
    .Add(Restrictions.On<Listing>(l => l.field == value))
    .List<Listing>();
DbSession.CreateCriteria(myDynamicallyDeterminedType)
.Add(限制.On(l=>l.field==value))
.List();

从技术上讲,这在某些情况下是允许的。即在c#4中使用协方差和一些反射。我相信所有需要的改变都是使IQueryOver接口协变

subType = typeof(ParentClass).Assembly.GetType(subTypeFullName);

var mi = typeof(QueryOver).GetMethod("Of", new Type[]{});
var gmi = mi.MakeGenericMethod(subType);
var qo = (QueryOver<ParentClass, ParentClass>)gmi.Invoke(null, null);
var queryOver = qo.GetExecutableQueryOver(session);

// your comment restrictions/projections here.
subType=typeof(ParentClass).Assembly.GetType(subjectFullName);
var mi=typeof(QueryOver).GetMethod(“Of”,新类型[]{});
var gmi=mi.MakeGenericMethod(子类型);
var qo=(QueryOver)gmi.Invoke(null,null);
var queryOver=qo.GetExecutableQueryOver(会话);
//您在此处的评论限制/预测。

我已经尝试过这个想法,只要我们能够在.NET4上构建它,它应该很容易工作

改用标准。它们在相同的条件下是相同的hood@Diego-我知道。但是QueryOver提供了一些很大的优势——特别是在构建时检查字段名是否正确等等。使重命名字段容易得多。为此编写单元测试很简单。