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;