QueryOver<A>(). Где (a => aBCount() > 0) не работает

Я получаю исключение: 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);
    }
}

1 ответ

Решение

QueryOver не является LINQ.

Ваш второй фрагмент кода работает, потому что он извлекает ВСЕ ЗАПИСИ и использует LINQ-to-объекты в памяти.

Что вы должны сделать, это:

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

или еще лучше:

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

Query это метод расширения, вам нужно добавить using NHibernate.Linq;

Другие вопросы по тегам