在LinqToEntities Where子句中使用.Equals()方法

时间:2014-08-29 17:27:25

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

我正在尝试编写通用实体框架存储库以减少代码重复。但是,我偶然发现了LinqToEntities的一个问题。

以下是我班级的简化代码段:

public class EntityFrameworkRepository<TEntity, TId> :where TEntity : IDataStoreEntity<TId>
{
    private IDbSet<TEntity> m_entities;

    public TEntity Get(TId id)
    {
        var m_entities = Entities.Where(entity=>entity.Id.Equals(id));
        var retrievedEntity = entities.FirstOrDefault();
        return retrievedEntity;
    }
}

由于使用了泛型,我必须使用.Equals()而不是==。但是由于这个LinqToEntities无法生成查询数据库所需的SQL。这会导致NotSupportException,并显示以下消息:

An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code

Additional information: Unable to create a constant value of type 'System.Object'. Only primitive types or enumeration types are supported in this context.

我目前的解决方法是.ToList()DbSet然后执行我的查询。但是,根据我的理解,这不是很有效,因为它将从数据库中提取所有条目。

这个问题有另一个解决方案吗?如果它有帮助我只打算使用原始类型作为Id。或者,我会接受一个答案,解释为什么我以这种方式使用仿制药很差。

1 个答案:

答案 0 :(得分:0)

如果您仅将其用于主键查找,则可以使用DbSet(TEntity).Find