C# .Net核心实体框架LINQ表达式无法';不可译

C# .Net核心实体框架LINQ表达式无法';不可译,c#,linq,entity-framework-core,expression-trees,C#,Linq,Entity Framework Core,Expression Trees,当我试图在where子句中使用props.getValue方法时,我得到一个错误。发生此错误是因为LINQ无法在SQL中转换此方法的调用,因为SQL不知道此方法。我读过一些关于表达式树的书,但我真的不知道如何使用它们,所以如果有人能告诉我如何正确使用它们,那就太好了 来自控制器的我的方法: int end = pageNumber * filter; int start = end - filter; var query = GetRequestsWithoutFil

当我试图在where子句中使用props.getValue方法时,我得到一个错误。发生此错误是因为LINQ无法在SQL中转换此方法的调用,因为SQL不知道此方法。我读过一些关于表达式树的书,但我真的不知道如何使用它们,所以如果有人能告诉我如何正确使用它们,那就太好了

来自控制器的我的方法:

  int end = pageNumber * filter; int start = end - filter;
            var query = GetRequestsWithoutFilter().Where(r => r.RequestStatus == 1);

            if (attribute != null && title!=null)
            {
                if (attribute.Equals("movieReleaseDate"))
                {
                    int i = Int32.Parse(title);
                    query = query.Where(r => (r.Movie.MovieReleaseDate) == i);
                }
                else
                {
                    Movie m = new Movie();
                    PropertyInfo props = m.GetType().GetProperties().Where(p => String.Equals(attribute, p.Name, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();

                    if (props!=null)
                    {
                        query = query.Where(r => ((string)props.GetValue(r.Movie)).Substring(0, (title.Length < r.Movie.MovieTitle.Length ? title.Length : r.Movie.MovieTitle.Length)).ToUpper().Equals(title));
                    }
                }
            }

            try { 
             var result = await query.Skip(start).Take(filter).ToListAsync();
                if (result == null)
                {
                    return NotFound();
                }
                return result;
            } catch(Exception e)
            {
                return null;
            }
            
        }
int end=pageNumber*过滤器;int开始=结束-过滤器;
var query=GetRequestsWithoutFilter(),其中(r=>r.RequestStatus==1);
if(属性!=null&&title!=null)
{
if(attribute.Equals(“movieReleaseDate”))
{
inti=Int32.Parse(标题);
query=query.Where(r=>(r.Movie.MovieReleaseDate)==i);
}
其他的
{
电影m=新电影();
PropertyInfo props=m.GetType().GetProperties().Where(p=>String.Equals(attribute,p.Name,StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
如果(道具!=null)
{
query=query.Where(r=>((字符串)props.GetValue(r.Movie)).Substring(0,(title.Length
GetRequestsWithoutFilter:

 [NonAction]
        private IQueryable<Request> GetRequestsWithoutFilter()
        {
            IQueryable<Request> query = _context.Requests.Include(r => r.User)
                                                .Include(r => r.Movie)
                                                .Select(e => new Request()
                                                {
                                                    RequestID = e.RequestID,
                                                    MovieID = e.MovieID,
                                                    Movie = new Movie()
                                                    {
                                                        MovieID = e.MovieID,
                                                        MovieTitle = e.Movie.MovieTitle,
                                                        MovieDescription = e.Movie.MovieDescription,
                                                        MovieDirector = e.Movie.MovieDirector,
                                                        MovieProducer = e.Movie.MovieProducer,
                                                        ImageSrc = String.Format("{0}://{1}{2}/Images/Movies/{3}", Request.Scheme, Request.Host, Request.PathBase, e.Movie.ImageName),
                                                        MovieReleaseDate = e.Movie.MovieReleaseDate, 
                                                    },
                                                    UserID = e.UserID,
                                                    User = new User()
                                                    {
                                                        UserID = e.User.UserID,
                                                        UserVorname = e.User.UserVorname,
                                                        UserNachname = e.User.UserNachname
                                                    },
                                                    RequestDate = e.RequestDate,
                                                    RequestStatus = e.RequestStatus
                                                });
            return query;
        }
[非动作]
私有IQueryable GetRequestsWithoutFilter()
{
IQueryable查询=_context.Requests.Include(r=>r.User)
.Include(r=>r.Movie)
.Select(e=>newrequest()
{
RequestID=e.RequestID,
MovieID=e.MovieID,
电影=新电影()
{
MovieID=e.MovieID,
MovieTitle=e.Movie.MovieTitle,
MovieDescription=e.Movie.MovieDescription,
电影导演,
MovieProducer=e.Movie.MovieProducer,
ImageSrc=String.Format(“{0}://{1}{2}/Images/Movies/{3}”,Request.Scheme,Request.Host,Request.PathBase,e.Movie.ImageName),
MovieReleaseDate=e.Movie.MovieReleaseDate,
},
UserID=e.UserID,
用户=新用户()
{
UserID=e.User.UserID,
UserVorname=e.User.UserVorname,
UserNachname=e.User.UserNachname
},
RequestDate=e.RequestDate,
RequestStatus=e.RequestStatus
});
返回查询;
}
电影模型:

using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace MoviesWebApi.Models
{
    public class Movie
    {
        public Movie()
        {
            Requests = new HashSet<Request>();
        }


        [Key]
        public int MovieID { get; set; }

        [Column(TypeName = "nvarchar(40)")]
        public string MovieTitle { get; set; }
        [Column(TypeName = "nvarchar(1000)")]
        public string MovieDescription { get; set; }
        [Column(TypeName = "nvarchar(40)")]
        public string MovieDirector { get; set; }
        [Column(TypeName = "nvarchar(40)")]
        public string MovieProducer { get; set; }

        public int MovieReleaseDate { get; set; }

        [Column(TypeName = "nvarchar(100)")]
        public string ImageName { get; set; }

        [NotMapped]
        public IFormFile ImageFile { get; set; }

        [NotMapped]
        public string ImageSrc { get; set; }

        public  ICollection<Request> Requests { get; set; }

    }
}

使用Microsoft.AspNetCore.Http;
使用制度;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
使用System.ComponentModel.DataAnnotations.Schema;
使用System.Linq;
使用System.Threading.Tasks;
名称空间MoviesWebApi.Models
{
公映
{
公共电影()
{
请求=新的HashSet();
}
[关键]
public int MovieID{get;set;}
[列(TypeName=“nvarchar(40)”)]
公共字符串MovieTitle{get;set;}
[列(TypeName=“nvarchar(1000)”)]
公共字符串MovieDescription{get;set;}
[列(TypeName=“nvarchar(40)”)]
公共字符串电影导演{get;set;}
[列(TypeName=“nvarchar(40)”)]
公共字符串电影制作人{get;set;}
public int MovieReleaseDate{get;set;}
[列(TypeName=“nvarchar(100)”)]
公共字符串ImageName{get;set;}
[未映射]
公共文件ImageFile{get;set;}
[未映射]
公共字符串ImageSrc{get;set;}
公共ICollection请求{get;set;}
}
}

反射调用如下

((string)props.GetValue(r.Movie))
作为查询的一部分,表达式树不可翻译

这里的内容是检索属性的值。与之等价的表达式是,但是您需要使用
expression
类方法构造整个谓词,这既繁琐又容易出错,或者使用一些辅助工具来编写表达式

这并不难,但在EF Core中有一个更简单的解决方案,因为它提供了一个名为的特殊方法,该方法被识别并正确翻译

要使用它,只需知道属性名和类型。后者在动态场景中有点问题,但幸运的是,您的目标似乎是
stringEF.Property<string>(r.Movie, props.Name)