如何使用通用属性类型查询EntityFramework?

时间:2017-02-02 06:11:13

标签: c# entity-framework-6

当我通过传递比较泛型DbSet.FirstOrDefault()的谓词来调用TId时,我得到以下异常:

  

无法创建“system.object”类型的常量值。只要   在此上下文中支持原始类型或枚举类型。

要查询的类型的接口:

interface IEntity<TId>
{
    TId id { get; set; }
}

此处抛出异常:

public virtual TEntity Get<TEntity, TId>(TId id) where TEntity : class, IEntity<TId>
{
    return dbContext.Set<TEntity>().FirstOrDefault(e => e.Id.Equals(id));
}

只有TId被约束为struct时,该功能才有效。如何将string包含为支持的类型?如果不可能,是否有可能以不同的方式完成任务?

2 个答案:

答案 0 :(得分:1)

这也适用于字符串:

public virtual TEntity Get<TEntity, TId>(TId id) 
    where TEntity : class, IEntity<TId>
    where TId: IEquatable<TId>
{
    return dbContext.Set<TEntity>().FirstOrDefault(e => e.Id.Equals(id));
}

答案 1 :(得分:1)

您只需使用Find方法:

public virtual TEntity Get<TEntity, TId>(TId id) where TEntity : class, IEntity<TId>
{
    return dbContext.Set<TEntity>().Find(id);
}