Вам необходимо понять разницу между LINQ to Entities и LINQ to Objects. Это невероятно важно отслеживать при работе с Entity Framework.
Когда вы отправляете запрос к ObjectContext, вы работаете в LINQ to Entities. Это вернет IQueryable. Пока вы работаете с переменной типа IQueryable, вы можете дополнительно составить запрос с помощью LINQ API, и когда вы окончательно перечислите результат, он будет преобразован в SQL.
Но вы говорите:
(у меня есть переменная site, которая уже является экземпляром, созданным EF)
Здесь вы запрашиваете свойство объекта, поэтому вы работаете в LINQ to Objects, а не в LINQ to Entities. Это означает, что ваш запрос имеет другого поставщика и не будет преобразован в SQL.
Относительно вашего второго запроса:
var posts = from post in db.Posts
where post.Site == site && post.Public == true
orderby post.PublicationTime descending
select post;
EF не позволяет вам сравнивать идентичности экземпляров в L2E. Вы должны сравнить ключ вместо этого. Попробуйте:
var posts = from post in db.Posts
where post.Site.Id == site.Id && post.Public
orderby post.PublicationTime descending
select post;
Кстати, я изменил post.Public == true
на post.Public
. Я думаю, что это чище.