在LINQ to entities中不支持成员

本文关键字:不支持 成员 entities LINQ to | 更新日期: 2023-09-27 18:03:37

所以我是c#, LINQ和MVC的新手。我试图得到一个年龄列表,但它说

在LINQ to Entities中不支持指定的类型成员'Age'。只有初始化器、实体成员和实体导航属性支持。

在前面的教程中,它们使用了完全相同的逻辑,除了它们检查的是字符串,而不是int (Age)。为什么这件事让我生气,我该如何解决?

public ActionResult SearchIndex(string ageValue, string searchString)
{
    if (!string.IsNullOrEmpty(ageValue))
    {
         var AgeList = new List<string>();
         var AgeListQry = from d in db.Actors orderby d.Age select d.Age.ToString();
         AgeList.AddRange(AgeListQry.Distinct());
    }
    // other stuff
}

我想知道发生了什么,这样我就可以避免这种情况在未来!

实体模型代码

public class Actor
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public DateTime BirthDate { get; set; }
        public int Age
        {
            get { 
                return (int)(DateTime.Now - BirthDate).TotalDays / 365; 
            }
        }
        public decimal NetValue { get; set; }
    }
    public class ActorDBContext : DbContext
    {
        public DbSet<Actor> Actors { get; set; }
    }

在LINQ to entities中不支持成员

正如评论中提到的,您不能在Linq to Entities查询中调用ToString()。不如这样做:

var AgeList = new List<string>();
//retrieve as whatever type Age is, no conversion in SQL Server
var AgeListQry = (from d in db.Actors orderby d.Age select d.Age).ToList();
//convert them after the fact, using Linq to Objects
AgeList.AddRange(AgeListQry.Select(a => a.ToString()).Distinct());

编辑

我看到你最近的更新,确实显示Age不是一个数据库列。然后,您需要做这样的事情(假设BirthDate被正确映射):

var AgeList = new List<string>();
//retrieve BirthDate from SQL Server and use ToList() to get it to run immediately
var AgeListQry = (from d in db.Actors orderby d.BirthDate select d.BirthDate).ToList();
//convert them after the fact, using Linq to Objects
AgeList.AddRange(AgeListQry.Select(bd => ((int)(DateTime.Now - bd).TotalDays / 365).ToString()).Distinct());

Linq到实体映射你的表达式到SQL语句,没有什么可以映射到当你使用你的Age属性。相反,你需要从SQL Server (BirthDate)中得到你能得到的,然后自己做翻译。如果您愿意,可以用如下的方法调用替换内联代码:

AgeList.AddRange(AgeListQry.Select(bd => CalculateAge(bd)).Distinct());
//...
private string CalculateAge(DateTime birthday)
{
   return ((int)(DateTime.Now - bd).TotalDays / 365).ToString();
}

您在DB方案中没有Age,并且不可能将LINQ转换为DB查询。您必须在客户端订购Age集合或在表中添加计算列。

还有另一种方法。有一个转换文件,在其中传递对象,处理出生日期并生成年龄,返回相同的对象。这也意味着,不能在数据库中搜索age列