0

我有这个实体:

 public class MyDTO
    {
        int id;
        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        DateTime createdOn;
        public DateTime CreatedOn
        {
            get { return createdOn; }
            set { createdOn = value; }
        }

        DateTime modifiedOn;
        public DateTime ModifiedOn
        {
            get { return modifiedOn; }
            set { modifiedOn = value; }
        }

        int duration;
        public int Duration
        {
            get { return ((TimeSpan)(ModifiedOn - CreatedOn)).Days; }
            protected set { }
        }
}

Duration是计算属性,还有这个映射文件:

internal partial class MyDTO_Mapping : EntityTypeConfiguration<MyDTO>
{
    public MyDTO_Mapping()
    {
        this.HasKey(t => t.Id);
        this.ToTable("MyDTO");
        this.Property(t => t.Id);
        this.Property(t => t.CreatedOn).HasColumnName("CreatedOn");
        this.Property(t => t.ModifiedOn).HasColumnName("ModifiedOn");
        this.Ignore(t => t.Duration);
    }
}

但是当我想对该实体进行查询时(我Duration在 where 子句中使用过),我得到了这个错误:

LINQ to Entities 不支持指定的类型成员“持续时间”。仅支持初始化程序、实体成员和实体导航属性。

我的错误在哪里?

4

1 回答 1

1

您的 LINQ 查询被转换为 SQL 查询并在 SQL 服务器上执行。服务器不知道您的计算属性,它不会将调用转换Duration((TimeSpan)(ModifiedOn - CreatedOn)).Days. 因此,要访问 的值,Duration您需要先从数据库中取出对象,然后再查询它们。

如建议的那样,调用ToList()orToArray()将实现(从数据库中获取)您的结果。

如果您的持续时间过滤器对性能很重要(例如,它过滤掉许多记录),那么编写一个复制持续时间属性计算的 where 子句可能是明智的,例如(未经测试):

from d in Context.MyDTOs where (d.ModifiedOn - d.CreatedOn).Days > 10 select d
于 2013-06-11T06:33:19.060 回答