NHibernate IQueryable.SingleOrDefault в подзапросе. Используйте предикат функции без выполнения - PullRequest
2 голосов
/ 12 декабря 2011

у меня есть Query

SpecialAttributes является IEnumerable

 q = from c in q
     let x = c.SpecialAttributes.Where(a => a.Attribute.Id == id)
                                .Select(z =>  z.AttribValue).SingleOrDefault()
     orderby Convert.ToDateTime(x)
     select c;

Мне нужно выполнить SQL-запрос сразу.

Но в этом случае каждый SingleOrDefault() будет выполняться отдельно от основного запроса.

Если количество результатов выборки будет 100 - SingleOrDefault() будет выполнено 100 раз.

Как это сделать в одном запросе, как FutureSingleOrDefault()?

1 Ответ

2 голосов
/ 12 декабря 2011

Если в вашей коллекции специальных атрибутов у вас не будет атрибутов с тем же идентификатором и что ваш класс "SpecialAttribute" имеет ссылку на родительский объект, это может сработать:

q.SelectMany(x => x.SpecialAttributes)
 .Where(x => x.Attribute.Id == id)
 .OrderBy(x => Convert.ToDateTime(x.AttribValue))
 .Select( x => x.Parent )
 .Distinct();

Я не знаю, будет ли EF анализировать Convert.ToDateTime () для правильного выражения t-sql. Если нет, вы можете сделать это в памяти (если коллекция не велика):

q.SelectMany(x => x.SpecialAttributes)
 .Where(x => x.Attribute.Id == id)
 .Select( x => new { Parent = x.Parent, Value = x.AttribVale} )
 .Distinct()
 .OrderBy(x => Convert.ToDateTime(x.Value))
 .Select(x => x.Parent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...