将Entity Framework 4.4
与Database First方法结合使用。我在大多数表中都定义了一个公共column
(比如; CreateDate)。
我不想为每种类型编写日期过滤查询,并试图避免reflection
我试图定义接口 ICreateDate
,例如:
interface ICreateDate
{
System.DateTime CreateDate { get; set; }
}
自动生成的课程:
//-----------------------------------------------------------------------------
// <auto-generated>
// ...
// </auto-generated>
//-----------------------------------------------------------------------------
namespace Project.Entity
{
using System;
using System.Collections.Generic;
public partial class SomeEntityClass
{
public System.DateTime CreateDate { get; set; }
}
}
部分课程:
public partial class SomeEntityClass : ICreateDate { }
代码异常:
private void SomeMethod()
{
using (ProjectModel pm = new ProjectModel())
{
IQueryable<ICreateDate> qry = pm.SomeEntityClass.AsQueryable().Cast<ICreateDate>();
qry = DateFilter(qry);
}
}
private IQueryable<ICreateDate> DateFilter(IQueryable<ICreateDate> queryable)
{
queryable = queryable.Where(q => q.CreateDate >= SomeRandomDate1 && q.CreateDate <= SomeRandomDate2);
return queryable.OrderByDescending(q => q.CreateDate);
}
通过IQueryable<SomeEntityClass>
传递失败的尝试时,异常消息:
无法将类型“Project.Entity.SomeEntityClass”强制转换为类型 'Project.Entity.ICreateDate'。 LINQ to Entities仅支持转换EDM 原始或枚举类型。
由于 LINQ to Entities仅支持转换EDM原语或枚举类型是反射我唯一的选择吗?
注意:我尝试使用通用方法方法 Erik Philips suggested但发生了同样的确切错误
编辑:我发现实体框架版本为4.4
,我认为EF 5.0已添加到.NET 4.0项目中
答案 0 :(得分:2)
由于LINQ to Entities仅支持转换EDM原语或枚举类型是反射我唯一的选择吗?
没有。数据库类是部分类,因此您可以定义接口:
public interface ICreateDate
{
DateTime CreateDate { get; set; }
}
让EF通过代码生成创建一个实体对象,它应该如下所示:
// MyObject.cs
public partial MyObject
{
public DateTime CreateDate { get; set; }
}
创建自己的分部类:
// MyObjectPartial.cs
public partial MyObject : ICreateDate
{
}
然后使用where子句创建一个泛型方法:
public IQueryable<T> DateFilter<T>(IQueryable<T> queryable)
where T : ICreateDate
{
//code
}
答案 1 :(得分:1)
我个人有一个EntityBase类,通常包含Id
和CreatedOn
。
然后,处理实体的所有方法都可以访问这些属性(或者如果您使用的方法适用于任何实体,只需转换为Method<EntityBase>
)
public class EntityBase
{
public DateTime CreatedOn { get; set; }
public int Id { get; set; }
}
public class SomeEntity : EntityBase
{
/*.....*/
}