Выполнение запроса().Где (a => a.B.Count() > 0) не работает

#nhibernate #queryover

#nhibernate #выполнение запроса

Вопрос:

Я получаю исключение: 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. Я предполагаю, что это опечатка во втором примере, и query.Where должно быть query1.Where ?

2. @pickypg: Спасибо, исправлена опечатка.

3. Можете ли вы показать свои сопоставления? И какую версию NHibernate вы используете?

4. @bniwredyc: Я пытаюсь воспроизвести эту проблему в другом проекте, затем опубликовать сопоставления. Я использую NHibernate 5.1.0.4000.

5. @caveman: ты имел в виду 3.1.0.4000? Пожалуйста, добавьте код класса A и его отображение к вашему вопросу.

Ответ №1:

выполнение запроса не является LINQ.

Ваш второй фрагмент кода работает, потому что он извлекает ВСЕ ЗАПИСИ и использует 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;

Комментарии:

1. Спасибо, это работает отлично! Еще один вопрос: вы имеете в виду, что эта функция не поддерживается в QueryOver? Я имею в виду, возможно ли перевести этот код в оператор QueryOver?