所以我是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; }
}
答案 0 :(得分: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 :(得分:1)
您尚未拥有Age
方案中的DB
,并且无法将LINQ
转换为数据库查询。
您必须在客户端订购Age
集合,或将计算列添加到您的表格中。
答案 2 :(得分:0)
还有另一种方式。有一个转换器文件,您可以在其中传递对象,使用生日和产生年龄,并返回相同的对象。这也意味着您无法在数据库中搜索“年龄”列