如何制作通用的Func <tentity,bool =“”>?

时间:2017-11-21 10:32:13

标签: c# .net generics lambda

我正在尝试为我的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层。在这个中间层,我不想为每个实体创建一个类,只有一个通用,它适用于我的上下文中的所有实体。

3 个答案:

答案 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();
    }
}