【问题标题】:Member is "not supported in LINQ to Entities"成员“在 LINQ to Entities 中不受支持”
【发布时间】:2014-05-14 21:08:26
【问题描述】:

所以我是 C#、LINQ 和 MVC 的新手。我正在尝试获取年龄列表,但它显示

LINQ to Entities 不支持指定的类型成员“年龄”。 只有初始化器、实体成员和实体导航属性 支持。

在之前的教程中,他们使用了完全相同的逻辑,只是他们检查的是字符串,而不是 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; }
    }

【问题讨论】:

  • ToString 在 SQL Server 端不受支持。不要使用 ToString()
  • @ToughCoder 你应该把这个作为答案发布:)
  • @SergeyBerezovskiy 这需要时间。:)
  • 你能展示你的实体模型吗?
  • @HamletHakobyan 添加了!

标签: c# linq entity-framework linq-to-entities


【解决方案1】:

如 cmets 中所述,您不能在 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();
}

【讨论】:

  • @BenAaronson 感谢您发现这一点,将ToList() 添加到数据库查询以确保立即对其进行评估
  • 是的,昨晚(使用 .Distinct())我仍然收到错误消息:LINQ to Entities 不支持指定的类型成员“年龄”。仅支持初始化器、实体成员和实体导航属性。
  • @Austin 是带ToList() 还是不带它?
  • 不用了,让我复制/粘贴一下
  • 错误再次出现,但现在它被抛出在 .ToList() 行...奇怪
【解决方案2】:

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

【讨论】:

  • 对不起,我不明白你的意思?这基本上是我接触这些东西的第二天。哈哈
  • @Austin,很简单,你不懂很奇怪。
  • @Austin 基本而言:您必须记住,LINQ to Entities 查询必须直接转换为普通 SQL 查询。这就是为什么您的查询中不能包含 .NET 特定内容(例如 ToString() 或 ToList() 等),因为翻译器可能无法直接将您的 LINQ 查询转换为 SQL 查询。
  • 哦,好吧,这很有道理。在过去的几天里,我开始学习视觉工作室、C#、SQL、LINQ、MVC、代码优先(许多其他东西),所以我仍在学习所有基础知识。谢谢!
  • @Austin,如果您能够更改数据库的方案,那么在表中添加计算列是解决此问题的最简单方法。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多