Как использовать Func с Entity Data Context? - PullRequest
0 голосов
/ 22 августа 2010

Я написал следующие коды 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&#60;TResult&#62; Load&#60;TKey,TResult&#62;(List&#60;TKey&#62; list, Func&#60;TKey, TResult&#62; select);
        List&#60;TResult&#62; Load&#60;TKey, TResult&#62;(Func&#60;TKey, TResult&#62; select);
    }


    public interface IErpManager
    {
        List&#60;TResult&#62; Load&#60;TKey,TResult&#62;(ILoad erpObj, List&#60;TKey&#62; list, Func&#60;TKey, TResult&#62; select);
        List&#60;TResult&#62; Load&#60;TKey, TResult&#62;(ILoad erpObj, Func&#60;TKey, TResult&#62; select);

    }

    public class ErpManager : IErpManager
    {

        #region IErpManager Members

        public List&#60;TResult&#62; Load&#60;TKey, TResult&#62;(ILoad erpObj, List&#60;TKey&#62; list, Func&#60;TKey, TResult&#62; select)
        {
            return erpObj.Load(list, select);
        }

        #endregion

        #region IErpManager Members


        public List&#60;TResult&#62; Load&#60;TKey, TResult&#62;(ILoad erpObj, Func&#60;TKey, TResult&#62; select)
        {
            return erpObj.Load(select);
        }

        #endregion
    }



}

1 Ответ

2 голосов
/ 22 августа 2010

Я думаю, что одной из ваших начальных проблем является то, что ваш интерфейс ILoad не является универсальным, но вы указали методы без общих ограничений, например,

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

Во-первых, предикаты должны иметь значение true или false, поэтому в действительности это должно быть 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();
        }
    }
}

Вы должны прочитать шаблон хранилища.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...