如何将Func与实体数据上下文一起使用?

时间:2010-08-22 17:22:58

标签: c# .net visual-studio linq entity-framework

我写下面的代码MyCustomer.cs必须返回List,它是Customer实体的类型。 ©使用Func方法。我想这样做:

return erpEntityCtx.Customer.Select(select).ToList<TResult>();

但错误归还给我:

有一些无效的论点。

我可以用这个:

return erpEntityCtx.Customer.Select(c=>c.Name).ToList<TResult>(); 

但是我不能用DataContext做到这一点我该怎么做?

public class MyCustomer :  Manager.ILoad
    {


        #region ILoad Members


        public List<TResult> Load<TKey, TResult>(Func<TKey, TResult> select)
        {
            using (Erp.DAL.ErpEntities erpEntityCtx = new Erp.DAL.ErpEntities())
            {
                return erpEntityCtx.Customer.Select(select).ToList<TResult>();
            }
        }

        #endregion
    }



namespace Erp.BLL.Manager
{

    public interface ILoad
    {
        List<TResult> Load<TKey,TResult>(List<TKey> list, Func<TKey, TResult> select);
        List<TResult> Load<TKey, TResult>(Func<TKey, TResult> select);
    }


    public interface IErpManager
    {
        List<TResult> Load<TKey,TResult>(ILoad erpObj, List<TKey> list, Func<TKey, TResult> select);
        List<TResult> Load<TKey, TResult>(ILoad erpObj, Func<TKey, TResult> select);

    }

    public class ErpManager : IErpManager
    {

        #region IErpManager Members

        public List<TResult> Load<TKey, TResult>(ILoad erpObj, List<TKey> list, Func<TKey, TResult> select)
        {
            return erpObj.Load(list, select);
        }

        #endregion

        #region IErpManager Members


        public List<TResult> Load<TKey, TResult>(ILoad erpObj, Func<TKey, TResult> select)
        {
            return erpObj.Load(select);
        }

        #endregion
    }



}

1 个答案:

答案 0 :(得分:2)

我认为您最初的一个问题是您的ILoad接口是非泛型的,但您指定的方法没有通用约束,例如。

List<TResult> Load<TKey, TResult>(Func<TKey, TResult> select);

首先,谓词必须评估为true,因此它应该是Func<TModel, bool> select,其中TModel是您的实体类型。

然后你试图这样做:

List<TResult> Load<TKey, TResult>(Func<TKey, TResult> select)
{
        using (Erp.DAL.ErpEntities erpEntityCtx = new Erp.DAL.ErpEntities())
        {
            return erpEntityCtx.Customer.Select(select).ToList<TResult>();
        }
}

如果没有为泛型方法指定任何约束(或者更好的是,您的泛型类),则无法使用Func来满足Func。

您需要更改为:

public interface IRepository<TModel>
{
   List<TModel> Get(Func<TModel, bool> predicate);
}

实施为:

public class CustomerRepository : IRepository<Customer>
{
    public List<Customer> Get(Func<Customer, bool> predicate)
    {
        using (var context = new ErpEntities())
        {
             return context.Customers.Where(predicate).ToList();
        }
    }
}

您应该阅读存储库模式。