#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?