使用LINQ for Entity Framework将实体强制转换为通用方法中的已实现接口

我有一个通用的方法来查询EF中TEntity类型的对象。 我想在TEntity实现特定接口的情况下将条件添加为where子句。 我的方法是:

public TEntity GetByUserID(Guid userID) { var query = this.DbSet; if (typeof (TEntity).IsImplementationOf()) { query = query .Where((x => !((IDeletableEntity)x).IsDeleted); } return query .FirstOrDefault(x => x.UserID == userID); } 

IsImplementationOf ()是一个方法,它只是返回true / false,顾名思义。

当我为实现IDeletableEntity的实体地址运行它时,我收到一个错误:

无法将类型“地址”强制转换为“IDeletableEntity”。 LINQ to Entities仅支持转换EDM原语或枚举类型。

任何想法我如何解决这个LINQ的限制?

这是一个有效的解决方案:

 public TEntity GetByUserID(Guid userID, params Include[] includes) { var query = this.DbSet; query = Where(query, x => !x.IsDeleted); return query .FirstOrDefault(x => x.UserID == userID); } public static IQueryable Where(IQueryable query, Expression> predicate) { if (typeof(TEntity).IsImplementationOf()) { query = ((IQueryable)query) .Where(predicate) .Cast(); } return query; } 

如果所有DbSets都具有’UserID’属性,则创建另一个名为’IUserID’的接口,然后尝试以下代码:

  protected TEntity GetByUserID(Guid userID) where TEntity : class { var user = this.Set() .ToList() .Cast() .Where(u => (!u.IsDeleted)) .Cast() .Where(u => (u.UserID == userID)) .FirstOrDefault(); return user; } 

我认为问题可能是您在语句中执行的直接转换以及查询可能正在实现枚举类型,因此IDeletable不会在一个实体上实现。

LINQ到实体的投射问题

提出这个解决方案

  return query.ToList() .Cast() .Where( e => e.Deleted ) .Cast();