Я использую EntityFramework и у меня проблемы с вышеуказанной ошибкой. Когда я призываю
var documents = docRepository.GetAllSavedDocuments();
var withRatings = documentFilter.GetDocumentsWithRating(documents, 1);
Я получаю ошибку в заголовке.
Мой код разделен на несколько классов
public class DocRepository
{
public IQueryable<Document> GetAllSavedDocuments(User user)
{
return (from d in AllUsersDocuments(user)
select d)
.Include(d => d.Calculations)
.Include("Calculations.CalculationResults");
}
}
public class DocumentFilter
{
public IQueryable<Tuple<Document, Rating>> GetDocumentsWithRating(IQueryable<Document> documents, int id)
{
return documents.Select(x => new
{
Document = x,
Rating = _ratingsProvider.GetRating.Compile()(x, id)
}).AsEnumerable()
.Select(x => new Tuple<Document, Rating>(x.Document, x.Rating)).AsQueryable().Where(x.Item2 == Rating.Ok);
}
}
public class RatingProvider
{
public Expression<Func<Document, int, Rating>> GetRating
{
get
{
return (document, id) =>
document.Calculations.Where(x => x.CId == id).Any() ?
document.Calculations.Single(x => x.CId == id).Rating.Value :
Rating.Unknown;
}
}
}
}
Дополнительная информация
Рейтинг - это Enum. Обнуляется в классе вычислений. Первоначально у меня был IEnumerable, и поэтому я мог использовать метод в классе Rating Provider для фильтрации, например:
var c = document.Calculations.SingleOrDefault(x => x.Id == id);
if (c == null)
{
return Rating.None;
}
if (!c.Rating.HasValue)
{
return Rating.None
}
return c.Rating.Value;
Но я бы хотел, чтобы он был запрашиваемым, чтобы мы выполняли его на стороне SQL, а не перечисляли все объекты в коде. Кто-нибудь может подсказать, как мне этого добиться?