【问题标题】:QueryOver<A>().Where(a => a.B.Count() > 0) does not workQueryOver<A>().Where(a => a.B.Count() > 0) 不起作用
【发布时间】:2011-04-25 19:17:53
【问题描述】:

运行时出现异常:Unrecognised method call in epression a.B.Count():

var query = session.QueryOver<A>()
    .Where(a => a.B.Count() > 0)
    .List();

以下代码有效:

var query1 = session.QueryOver<A>().List();
var query2 = query1.Where(a => a.B.Count() > 0);

有什么想法吗?谢谢。


编辑:

这是我的映射。我正在使用 NHibernate 3.1.0.4000:

型号:

public class A
{
    public virtual int Id { get; private set; }
    public virtual ICollection<B> Bs { get; set; }
}

public class B
{
    public virtual int Id { get; private set; }
}

映射:

public class AMappings : ClassMap<A>
{
    public AMappings()
    {
        Id(x => x.Id);
        HasMany(x => x.Bs).LazyLoad();
    }
}

public class BMappings : ClassMap<B>
{
    public BMappings()
    {
        Id(x => x.Id);
    }
}

我的其余代码:

class Program
{
    static void Main(string[] args)
    {
        // Create connection string
        string connectionString = new System.Data.SqlClient.SqlConnectionStringBuilder()
                                   {
                                      DataSource = @".\r2",
                                      InitialCatalog = "TestNHibernateMappings",
                                      IntegratedSecurity = true
                                   }.ConnectionString;

        // Create SessionFactory
        ISessionFactory sessionFactory = Fluently.Configure()
        .Database(MsSqlConfiguration
                      .MsSql2008.ConnectionString(connectionString)
                      .ShowSql())
        .Mappings(m => m.FluentMappings
            .Add(typeof(AMappings))
            .Add(typeof(BMappings)))
        .ExposeConfiguration(BuildSchema)
        .BuildConfiguration()
        .BuildSessionFactory();

        // Test
        var session = sessionFactory.OpenSession();

        // This line works OK
        var query1 = session.Query<A>()
            .Where(a => a.Bs.Count() > 0);

        // This line throws exception: Unrecognised method call in epression a.Bs.Count()
        var query2 = session.QueryOver<A>()
            .Where(a => a.Bs.Count() > 0);
    }

    static void BuildSchema(Configuration cfg)
    {
        new SchemaExport(cfg).Create(false, true);
    }
}

【问题讨论】:

  • 我认为这是第二个示例中的拼写错误,query.Where 应该是 query1.Where?
  • @pickypg:谢谢,错字已更正。
  • 你能展示你的映射吗?你使用什么版本的 NHibernate?
  • @bniwredyc:我正在尝试在另一个项目中复制此问题,然后发布映射。我正在使用 NHibernate 5.1.0.4000。
  • @caveman:你的意思是 3.1.0.4000?请将 A 类的代码及其映射添加到您的问题中。

标签: nhibernate queryover


【解决方案1】:

QueryOver 不是 LINQ。

您的第二个代码 sn-p 有效,因为它正在检索所有记录并在内存中使用 LINQ-to-objects。

你应该做的是:

session.Query<A>()
       .Where(a => a.B.Count() > 0)
       .ToList();

或者更好:

session.Query<A>()
       .Where(a => a.B.Any())
       .ToList();

Query是扩展方法,需要加using NHibernate.Linq;

【讨论】:

  • 谢谢,完美!还有一个问题:你的意思是QueryOver不支持这个功能吗?我的意思是可以将这段代码翻译成 QueryOver 语句吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-11
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多