Проблема динамического запроса linq-to-nhibernate - PullRequest
1 голос
/ 09 ноября 2010

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

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.

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

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010
var query = from foo in session.Linq<Foo>()
                 select foo.ContainerBar;

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

Ваш объект "запрос" теперь является IQueryAble из ContainerBar's Поэтому, когда вы делаете Where (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 голосов
/ 11 ноября 2010

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

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

Теперь, когда у вас есть Бары, в своем следующем коде вы можете проверить F1 следующим образом ...

var result = bars
    .Where(bar => bar.Foos.Any(foo => foo.F1 == "b"));
...