我有这个实体:
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);
}
}
但是当我想对这个实体进行查询时(我在where子句中使用了Duration
),我收到了这个错误:
LINQ to不支持指定的类型成员'Duration' 实体。仅初始化程序,实体成员和实体导航 支持属性。
我的错误在哪里?
答案 0 :(得分:1)
您的LINQ查询已转换为SQL查询并在SQL Server上执行。服务器不知道您计算的属性,也不会将对Duration
的调用转换为((TimeSpan)(ModifiedOn - CreatedOn)).Days
。因此,要访问Duration
的值,您需要先将对象从数据库中取出,然后再查询它们。
根据建议,对ToList()
或ToArray()
的调用将实现(从数据库中获取)您的结果。
如果过滤器的持续时间对性能很重要(例如,它过滤掉许多记录),那么编写一个复制持续时间属性计算的where子句可能是明智的,例如(未经测试):
from d in Context.MyDTOs where (d.ModifiedOn - d.CreatedOn).Days > 10 select d