C# 无法将“System.Linq.Expressions.MethodCallExpression”类型的对象强制转换为“System.Linq.Expressions.LambdaExpression”类型
我正在使用EntityFramework,遇到上述错误。当我调用C# 无法将“System.Linq.Expressions.MethodCallExpression”类型的对象强制转换为“System.Linq.Expressions.LambdaExpression”类型,c#,sql,entity-framework,linq,entity-framework-6,C#,Sql,Entity Framework,Linq,Entity Framework 6,我正在使用EntityFramework,遇到上述错误。当我调用 var documents = docRepository.GetAllSavedDocuments(); var withRatings = documentFilter.GetDocumentsWithRating(documents, 1); 我得到了标题中的错误 我的代码分为几个类 public class DocRepository { public IQueryable<Document> Get
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;
}
}
}
但我想保持它的可查询性,所以我们在SQL端执行它,而不是枚举代码中的所有对象。请有人建议我如何做到这一点?您可以先为_ratingsProvider.GetRating分配一个变量,以避免标题中出现错误 之后,您将出现另一个错误,即实体框架不支持您的查询。你需要像LINQKit这样的东西。AsExpandable和Invokex,id来自LINQKit
using LinqKit;
GetDocumentsWithRatingIQueryable文档中的id是什么,int id?非常感谢。我已经接受了这个答案,但我的低代表性意味着它还不会出现。谢谢你也指出linqkit。
using LinqKit;
public IQueryable<Tuple<Document, Rating>> GetDocumentsWithRating(IQueryable<Document> documents, int id)
{
var getRatingExpression = _ratingsProvider.GetRating;
return documents.AsExpandable().Select(x => new
{
Document = x,
Rating = getRatingExpression.Invoke(x, id)
}).AsEnumerable()
.Select(x => new Tuple<Document, Rating>(x.Document, x.Rating)).AsQueryable().Where(x.Item2 == Rating.Ok);
}
public Expression<Func<Document, int, Rating>> GetRating
{
get
{
return (document, id) =>
document.Calculations.Where(x => x.CId == id).Any() ?
document.Calculations
.Where(x => x.CId == id)
.Select(x => x.Rating.HasValue ? x.Rating.Value : Rating.None)
.Single()
Rating.Unknown;
}
}
public class DocumentRating
{
public Document { get; set; }
public Rating { get; set; }
}
public IQueryable<DocumentRating> GetDocumentsWithRating(IQueryable<Document> documents, int id)
{
var getRatingExpression = _ratingsProvider.GetRating;
return documents.AsExpandable().Select(x => new DocumentRating
{
Document = x,
Rating = getRatingExpression.Invoke(x, id)
})
.Where(x.Item2 == Rating.Ok);
}