【发布时间】:2019-06-01 15:08:42
【问题描述】:
我最近一直在研究实体框架和存储库模式,在存储库类中,我创建了一个名为 find 的函数,它使用谓词从中生成实体。这是我的存储库函数。
public T Find(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderby = null, string includeProperties = "")
{
IQueryable<T> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach(var includeProperty in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderby != null)
{
return orderby(query).First();
}
else
{
return query.First();
}
}
这是我的 DTO 课程。
public class UsersDo
{
public int UserId {get;set}
public string Username {get;set}
...
}
现在我在我的页面上调用 Find 函数,例如:
usersDao.Find(x=>x.Username == "username")
但是我得到了错误
The entity or complex type 'UsersDo' cannot be constructed in a LINQ to Entities query.
谁能指出这里出了什么问题。
编辑
在存储库类下,我有一个构造函数:
private readonly DbSet<T> dbSet;
private readonly DataContext context;
public GenericDao(DataContext _context)
{
context = _context;
dbSet = context.Set<T>();
}
我的道课:
public class UsersDao : GenericDao<UsersDo>, IUsers
{
public UsersDao(DataContext context) : base (context) {}
...
}
【问题讨论】:
-
你怎么知道正确的dbSet?顺便说一句,实体框架本身遵循存储库模式,我不建议您使用外部存储库模式,因为它会导致复杂性、功能不足、不需要的错误等等。我可以说你最终会需要绕过你的存储库模式
-
@Simonare 更新了我的问题,您能否给我任何参考,说明我如何使用默认的 EF 存储库模式,希望通过上面的示例说明我的担忧。
-
你可以试试
IQueryable<T> query = dbSet.AsQueryable();吗? -
@Simonare,这没有用,它仍然抛出同样的错误。
标签: c# entity-framework repository-pattern predicate