【问题标题】:Entity Framework and Cast<>实体框架和 Cast<>
【发布时间】:2012-04-27 19:07:14
【问题描述】:

我有这门课(你可以看到它的全部内容here)...

internal class BaseRepository<I, C> : IRepository<I>
    where I : class, IBaseObject
    where C : BaseObject
{
    private Context _context;

    public IEnumerable<I> FindBy(Expression<Func<I, bool>> predicate)
    {
        return _context.Set<C>().ToList().Cast<I>().AsQueryable().Where(predicate);
    }

    // other methods.
}

我怎样才能做到这一点,这样我就不必打电话给.ToList(),我相信这会导致EF返回.Set&lt;C&gt;()中的所有内容

在没有.ToList().AsQueryable() 的情况下使用它会导致错误:

System.NotSupportedException:无法将类型“Sln.DAL.Sql.Entities.Project”转换为类型“Sln.DAL.Entities.IProject”。 LINQ to Entities 仅支持转换 EDM 基元或枚举类型。

【问题讨论】:

  • 介意告诉我们您为什么需要ToList吗?如果删除它会发生什么?
  • BaseObject 是否总是从 I 派生的?
  • 是的。 BaseObject 实现 IBaseObject
  • 菲尔,再次添加您的答案。它奏效了。

标签: c# linq entity-framework


【解决方案1】:

如果我们添加一个约束

internal class BaseRepository<I, C> : IRepository<I>
    where I : class, IBaseObject
    where C : BaseObject, I

然后我们可以使用

_context.Set<C>().Where(predicate).AsEnumerable();

【讨论】:

  • context.Set&lt;C&gt;().Where(predicate).AsEnumerable(); 在 linq2EF 中引发异常。
猜你喜欢
  • 2013-02-10
  • 2011-10-11
  • 2020-08-12
  • 2011-08-20
  • 2011-10-25
  • 2013-04-13
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多