为什么选择NHibernate的界面IQueryOver <t>的方法&#34;其中&#34;在一个上下文中可用,但在其他情况下不可用?

时间:2015-04-27 13:39:58

标签: c# nhibernate queryover

这是第一种情况

using (ISession session = NHibernateHelper.OpenSession())
{
    using (ITransaction transaction = session.BeginTransaction())
    {
        session.QueryOver<T>().Where() // all ok

    }
}

这是相同的界面,但在其他类

productRepository.ExecuteQuery(over =>
{
    IQueryOver<Product> inOtherContext = over;
    inOtherContext.Where // where method not exists
});

我确定命名空间没有问题。

1 个答案:

答案 0 :(得分:0)

这里的解决方案是使用一个不同的接口

IQueryOver<Product, Product>

例如,我们可以在16.5. Aliases的文档中看到它是如何工作的:

Cat catAlias = null;

IQueryOver<Cat,Cat> catQuery =
    session.QueryOver<Cat>(() => catAlias)
    ....

检查source code here

/// <summary>
/// QueryOver&lt;TRoot,TSubType&gt; is an API for retrieving entities by composing
/// <see cref="Criterion.Expression" /> objects expressed using Lambda expression syntax
/// </summary>
/// <remarks>
/// <code>
/// IList&lt;Cat&gt; cats = session.QueryOver&lt;Cat&gt;()
///     .Where( c =&gt; c.Name == "Tigger" )
///     .And( c =&gt; c.Weight > minWeight ) )
///     .List();
/// </code>
/// </remarks>
public interface IQueryOver<TRoot,TSubType> : IQueryOver<TRoot>
{
   ...