“ LINQ to Entities不支持成员”

问题描述 投票:4回答:3

所以我是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; }
    }
c# linq entity-framework linq-to-entities
3个回答
9
投票

如评论中所述,您不能在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 to Entities将您的表达式映射到SQL语句,当您使用Age属性时,它没有映射到的对象。相反,您需要从SQL Server(BirthDate)中获取可用的内容,然后自己转换为Age。如果您愿意,可以用以下方法调用替换内联代码:

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

1
投票

您在Age方案中没有DB,因此无法将LINQ转换为数据库查询。您必须在客户端订购Age集合或将计算列添加到表中。


0
投票

还有另一种方法。有一个转换器文件,您可以在其中传递对象,使用生日和产生年龄,并返回相同的对象。这也意味着您无法在数据库中搜索“年龄”列

© www.soinside.com 2019 - 2024. All rights reserved.