我正在尝试为我的Dao Entity Framework上下文创建一个通用查询。像这样:
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 ));
}
我在&#34; x.ID&#34;中有na错误那说:&#34; TEntEF&#34;不包含&#34; ID&#34;的定义并且找不到任何&#34; ID&#34;接受类型&#34; TEntEF&#34;的第一个参数的扩展方法; (是否缺少使用指令或程序集引用?)
如果我这样做:
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));
}
我在&#34;(pred)&#34;说:不能转换为&#34; System.Func<EFBcostedSQL.PESSOAS, BOOL>
&#34;到&#34; System.Func<TEntEF, bool>
&#34;
我不知道其他任何方式......我知道如何解决这个问题?
--- 稍后添加 ----------------------------------- -------------- 我不想做基类或接口,因为我正在使用DataBase First,如果我必须扩展所有的部分类,那就没有意义了。除此之外我的基类无法拥有所有类的属性,我希望能够使用任何属性。
现在我明白没有可能,我试试这个因为我有一个中间层,所以我的View层没有看到我的Context层。在这个中间层,我不想为每个实体创建一个类,只有一个通用,它适用于我的上下文中的所有实体。
答案 0 :(得分:0)
您的实体必须使用ID属性实现通用接口 例如:
public interface IHasId<T> where T: struct
{
T ID { get; set; }
}
public class PESSOAS: IHasId<int>
{
[Key]
public int ID { get; set; }
}
并将其用作:
Func<PESSOAS, bool>
答案 1 :(得分:0)
由于您使用特定实体类型(PESSOAS)进行过滤,因此您需要返回该特定类型而非通用TEnt
:
public List<PESSOAS> GetPessoasWithID2()
{
Func<PESSOAS, bool> pred = delegate (PESSOAS item)
{
return item.ID == 2;
};
return Dao.Buscar(pred);
}
当然可以缩短为
public List<PESSOAS> GetPessoasWithID2()
{
return Dao.Buscar<PESSOAS>(item => item.ID == 2);
}
答案 2 :(得分:0)
这是你要找的吗?不是100%肯定我理解这个问题。如果我不合时宜告诉我......
class Customer
{
[Key]
public string Name { get; set; }
}
class Order
{
[Key]
public int OrderNumber { get; set; }
public decimal Total { get; set; }
}
class MyContext : DbContext
{
public MyContext()
{
//connect MyContext to some data source here
Customers.Add(new Customer { Name = "John" });
Customers.Add(new Customer { Name = "Jacob" });
Customers.Add(new Customer { Name = "Hannah" });
}
public DbSet<Customer> Customers { get; set; }
public DbSet<Order> Orders { get; set; }
public IQueryable<TEntity> Buscar<TEntity>(Expression<Func<TEntity, bool>> predicate)
where TEntity : class
{
return this.Set<TEntity>().Where(predicate).AsQueryable<TEntity>();
}
}
class Program
{
static void Main(string[] args)
{
MyContext _context = new MyContext();
IQueryable<Customer> _customers = _context.Buscar<Customer>(c=>c.Name.StartsWith("J"));
foreach(Customer cust in _customers)
{
Console.WriteLine("Customer Name=" + cust.Name);
}
Console.ReadKey();
}
}