2010-11-09 2 views
1

Предположим, у меня есть классы Foo и Bar следующим образом:Dynamic LINQ к NHibernate проблема запроса

public class Foo 
{ 
public string F1 {set; get;} 
public string F2 {set; get;} 

public Bar ContainerBar {set; get;} 
} 

public class Bar 
{ 
public string B1 {set; get;} 
public string B2 {set; get;} 

public List<Foo> Foos {set; get;} 
} 

После запроса LINQ содержит ошибки, говоря, что foo не содержит свойство с именем F1.

var query = from foo in session.Linq<Foo>() 
       select foo.ContainerBar; 

query = query.Where(foo => foo.F1 == "abcdef"); 

Я знаю foo во втором заявлении действительно Bar, поскольку запрос выбирает ContainerBar.

Вопрос заключается в том, как я могу добавить предложение динамического предложения для запроса без изменения запроса origianl? Конечная цель - иметь подзапросы с linq-to-nhibernate.

ответ

3
var query = from foo in session.Linq<Foo>() 
       select foo.ContainerBar; 

query = query.Where(foo => foo.F1 == "abcdef"); 

Ваш «запрос» объект теперь IQueryable из ContainerBar-х Так что, когда вы делаете Где (Foo => foo.F1 == «ABCDEF»), это делается на IQueryable, так что нет свойства F1.

Вы должны сделать:

var bars = from foo in session.Linq<Foo>() 
      where foo.F1 == "abcdef" 
      select foo.ContainerBar; 

Или:

var q = session.Linq<Foo>(); 

// if some condition 
q = q.Where(foo => foo.F1 == "abcdef"); 

var bars = q.Select(foo => foo.ContainerBar); 
+0

но где предложение должно быть добавлено во время выполнения. –

+0

Я обновил свой ответ – mathieu

0

вы используете NHibernate 3.0? Первый запрос не работает для меня (NHibernate 2.1.2.4000, неверный листинг). Тем не менее, это выглядит, как вы пытаетесь получить все бары, которые имеют FOOS, что может быть сделано, как это ...

IQueryable<Bar> bars = Session 
    .Linq<Bar>() 
    .Where(bar => bar.Foos.Any()); 

Теперь, когда у вас есть бары, в вашем позже коде вы можете проверить, как это F1 ...

+0

Нет, я использую NHibernate 2.1.2 –

Смежные вопросы