Вопрос

Предположим, у меня есть занятия 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.

Вопрос в том, как я могу добавить динамику, где предложение к запросу без изменения запроса оригинала? Окончательной целью является наличие подзадач с Linq-to-Nhibernate.

Это было полезно?

Решение

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

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

Ваш объект «Запрос» теперь представляет собой контейнер -контейнер, поэтому, когда вы делаете, где (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 );

Другие советы

Вы используете 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"));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top