Nhibernate QueryOver<;A>;()。其中(a=>;a.B.计数()>;0)不起作用

Nhibernate QueryOver<;A>;()。其中(a=>;a.B.计数()>;0)不起作用,nhibernate,queryover,Nhibernate,Queryover,我在执行以下操作时,在epression a.B.Count()中遇到异常:无法识别的方法调用: var query = session.QueryOver<A>() .Where(a => a.B.Count() > 0) .List(); var query=session.QueryOver() .其中(a=>a.B.计数()>0) .List(); 以下代码起作用: var query1 = session.QueryOver<A>

我在执行以下操作时,在epression a.B.Count()中遇到异常:
无法识别的方法调用

var query = session.QueryOver<A>()
    .Where(a => a.B.Count() > 0)
    .List();
var query=session.QueryOver()
.其中(a=>a.B.计数()>0)
.List();
以下代码起作用:

var query1 = session.QueryOver<A>().List();
var query2 = query1.Where(a => a.B.Count() > 0);
var query1=session.QueryOver().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; }
}
公共A类
{
公共虚拟整数Id{get;private set;}
公共虚拟ICollection Bs{get;set;}
}
公共B级
{
公共虚拟整数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);
    }
}
公共类映射:类映射
{
公共物品()
{
Id(x=>x.Id);
HasMany(x=>x.Bs);
}
}
公共类B映射:类映射
{
公共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);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
//创建连接字符串
string connectionString=new System.Data.SqlClient.SqlConnectionStringBuilder()
{
数据源=@“\r2”,
InitialCatalog=“TestNHibernateMappings”,
IntegratedSecurity=true
}.连接字符串;
//创建会话工厂
ISessionFactory sessionFactory=fluntly.Configure()
.数据库(MSSQL)配置
.MsSql2008.ConnectionString(ConnectionString)
.ShowSql())
.Mappings(m=>m.FluentMappings
.Add(类型(材料))
.添加(类型(b应用)))
.ExposeConfiguration(构建架构)
.BuildConfiguration()
.BuildSessionFactory();
//试验
var session=sessionFactory.OpenSession();
//这条线行吗
var query1=session.Query()
.其中(a=>a.Bs.Count()>0);
//此行引发异常:epression a.Bs.Count()中无法识别的方法调用
var query2=session.QueryOver()
.其中(a=>a.Bs.Count()>0);
}
静态void BuildSchema(配置cfg)
{
新建SchemaExport(cfg).Create(false,true);
}
}
查询版本不是LINQ

您的第二个代码段工作正常,因为它正在检索所有记录并使用LINQ to内存中的对象

你应该做的是:

session.Query<A>()
       .Where(a => a.B.Count() > 0)
       .ToList();
session.Query()
.其中(a=>a.B.计数()>0)
.ToList();
或者更好:

session.Query<A>()
       .Where(a => a.B.Any())
       .ToList();
session.Query()
.其中(a=>a.B.Any())
.ToList();
Query
是一种扩展方法,需要使用NHibernate.Linq添加

查询版本不是LINQ

您的第二个代码段工作正常,因为它正在检索所有记录并使用LINQ to内存中的对象

你应该做的是:

session.Query<A>()
       .Where(a => a.B.Count() > 0)
       .ToList();
session.Query()
.其中(a=>a.B.计数()>0)
.ToList();
或者更好:

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

Query
是一种扩展方法,需要使用NHibernate.Linq添加

我假设第二个示例和
查询中有一个输入错误。Where
应该是
query1。Where
?@pickypg:谢谢,输入错误已更正。您能显示您的映射吗?你使用的是什么版本的NHibernate?@bniwredyc:我正试图在另一个项目中复制这个问题,然后发布映射。我用的是NHibernate 5.1.0.4000。@穴居人:你是说3.1.0.4000?请将类的代码及其映射添加到您的问题中。我假设在第二个示例和
查询中它是一个输入错误。Where
应该是
query1。Where
?@pickypg:谢谢,输入错误已更正。您能显示您的映射吗?你使用的是什么版本的NHibernate?@bniwredyc:我正试图在另一个项目中复制这个问题,然后发布映射。我用的是NHibernate 5.1.0.4000。@穴居人:你是说3.1.0.4000?请将类的代码及其映射添加到您的问题中。谢谢,这非常有效!还有一个问题:您的意思是QueryOver不支持此功能吗?我的意思是,有可能把这段代码翻译成QueryOver语句吗?谢谢,这非常有效!还有一个问题:您的意思是QueryOver不支持此功能吗?我的意思是有可能把这段代码翻译成QueryOver语句吗?