【发布时间】:2017-11-21 10:32:12
【问题描述】:
我正在尝试对我的 Dao 实体框架上下文进行通用查询。像这样:
public List<TEntity> Buscar(Func<TEntity, bool> predicate)
{
return SelectAll().Where(predicate).AsQueryable().ToList();
}
public List<TEntity> SelectAll()
{
return DbContexto.Set<TEntity>().ToList();
}
但我找不到如何调用该方法,因为我不知道实体,因此 lambda 表达式不接受我尝试传递的成员。如果我试试这个:
public List<TEnt> Buscar()
{
return AutoMapperConfig.Mapper.Map<List<TEntEF>, List<TEnt>>(Dao.Buscar(x => x.ID == 1 ));
}
我在“x.ID”中有一个错误说:“TENtEF”不包含“ID”的定义,并且找不到任何接受“TENtEF”类型的第一个参数的“ID”扩展方法(是是否缺少使用指令或程序集引用?)
如果我这样尝试:
public List<TEnt> Buscar()
{
Func<PESSOAS, bool> pred = delegate (PESSOAS item)
{
return item.ID == 2;
};
return AutoMapperConfig.Mapper.Map<List<TEntEF>, List<TEnt>>(Dao.Buscar(pred));
}
我在“(pred)”中没有错误说:无法从“System.Func<EFBcostedSQL.PESSOAS, BOOL>”转换为“System.Func<TEntEF, bool>”
我不知道任何其他方法...知道如何解决这个问题吗?
---稍后添加------------------------------------ -------------- 我不想做基类或接口,因为我首先使用 DataBase,如果我必须扩展所有部分类,那没有意义。除此之外,我的基类无法拥有所有类的属性,我希望能够使用任何属性。
现在我明白不可能了,我试试这个,因为我有一个中间层,所以我的视图层看不到我的上下文层。在这个中间层中,我不想为每个实体创建一个类,只有一个通用类,它适用于我的上下文中的所有实体。
【问题讨论】:
-
您的最后两个代码示例没有意义:您的方法有一个
predicate参数,但从不使用它。 -
1) 看起来您正在使用 EF,因此您需要
Expression<Func<TEnt, bool>>,而不仅仅是 func 2) 您可以指定所有TEnt将继承自的接口或基类。跨度> -
顺便说一句,
Buscar方法称为SelectAll,它会在查询之前将整个数据库表拖到内存中 - 请不要养成这种习惯。 -
感谢@Heinzi 的关注。忽略(我在上次编辑中删除)我试图找到如何安装这个谓词。
-
@zaitsman.Yes 你明白了。但我不想这样做,因为我首先使用 DataBase,如果我必须扩展所有部分类,这没有意义。除此之外,我的基类没有办法拥有所有类的属性,我希望能够使用任何属性。