3

у меня есть что-то вроде этого:EF Code First + ленивая загрузка, проектор не работает, как ожидалось

var tmp =_forumsDb.Threads 
.Where(t => t.Id == variable) 
.Select(t => new { Thread = t, Posts = t.Posts.Take(1) }) 
.Single(); 

Теперь, я ожидал tmp.Thread.Posts.Count(); быть 1, но он принимает все сообщения, которые я есть в базе данных. Можно ли использовать проекцию, которая занимает явное количество сообщений, делать это в одном запросе без отключения ленивой загрузки?

Edit: Я пытался сделать что-то вроде этого, но это не работает, либо:

var tmp =_forumsDb.Threads 
.Where(t => t.Id == variable) 
.Select(t => new { Thread = t, Posts = t.Posts.OrderBy(p => p.DateCreated).Take(1) }) 
.Select(t => t.Thread) 
.Single(); 
+0

Я думаю, что это законный вопрос и не заслуживает нисходящего. – rcdmk

+0

Я считаю, что ответ на ваш вопрос просто: Нет. Почему бы вам не отключить ленивую загрузку? Вы хотите это для других свойств навигации объекта 'Thread'? – Slauma

ответ

2

tmp.Thread.Posts является навигационным свойством, для которого настроена отложенная загрузка. Поскольку он еще не загружен, доступ к нему загружает все остальные записи.

tmp.Posts не является навигационным устройством. Это тот, с которым вы должны иметь доступ, без запуска другого запроса.

+0

Да, tmp.Posts загружается правильно, и это только одно сообщение. Но я хочу, чтобы он проецировал эти tmp.Posts в tmp.Thread.Posts, как мне это сделать? – ojek

+0

@ojek Lazy loading либо включена для всех свойств навигации, либо отключена для всех свойств навигации. Там просто нет способа отключить его для одного конкретного свойства одного конкретного объекта. – hvd