Linq 2 Sql - Репозиторий не работает, если запрос не выполняется внутри контроллера - PullRequest
1 голос
/ 17 мая 2011

Я действительно изо всех сил пытаюсь понять проблему, с которой сталкиваюсь. У меня очень простой репозиторий со следующим кодом:

public class ProductRepository : IProductRepository
{
    private Table<Product> productTable;

    public Product GetProductById(int id)
    {
         return productTable.Where(p => p.ProductId == id).Single();
    }

    public IQueryable<Product> GetProducts()
    {
        return productTable;
    }
 }

У меня есть контроллер с именем AddToCart (). Вышеуказанный класс репозитория передается в контроллер через DI. Я передаю productId в этот контроллер, и вызывается метод репозитория. Проблема в том, что нулевое значение возвращается, когда Продукт существует.

    public void AddToCart(int productId)
    {
        //Returns Null value
        Product product = productRepository.GetProductById(productId);
        ...
    }

Я думал, что проблема может быть в том, что мне нужно IQueryable<> вокруг класса, который я возвращаю. Я также изменил свой метод AddToCart различными способами, чтобы попытаться заставить его работать.

public IQueryable<Product> GetProductById(int id)
{
    return productTable.Where(p => p.ProductId == id);
}

public void AddToCart(int productId)
{
    //Throws error / Returns Null value
    Product product = productRepository.GetProductById(productId).Single();
    //Returns Null value
    Product product = productRepository.GetProductById(productId).FirstOrDefault();
}

Тем не менее, следующее работает, и у меня нет причин, почему! По сути, это тот же код, который выполняется в контроллере. У кого-нибудь есть идеи? : /

    public void AddToCart(int productId)
    {
        Product product = productRepository.GetProducts().FirstOrDefault(p => p.ProductId == productId);
    }

Ответы [ 2 ]

0 голосов
/ 17 мая 2011

Интересно, возможно, у вас возникли проблемы с инъекцией зависимостей.Вы используете .Single (), которая, согласно документам, сгенерирует исключение, если в коллекции нет точно ни одного элемента, удовлетворяющего вашему условию.

Я бы попробовал реализовать это без использования Dependency Injection и посмотреть, если вы получите те же результаты.Вы также можете попробовать создать экземпляр продукта и вернуть его непосредственно из метода GetProductById (вместо извлечения из базы данных), чтобы исключить любые странности, происходящие с вашим DI.

0 голосов
/ 17 мая 2011

Трудно понять, в чем проблема, без дополнительной информации.

  1. Как GetProductById () возвращает ноль?Функция Single () не позволяет возвращать значения NULL и создает исключение InvalidOperationException, если нет ни одного элемента или возвращено более одного элемента.
  2. Что делает GetProducts () по-другому?Глядя на ваш код, проблем не должно быть.

Что произойдет, когда вы попробуете это?

public class ProductRepository : IProductRepository
  {    
    private Table<Product> productTable;    

    public Product GetProductById(int id)    {         
        return GetProducts().Where(p => p.ProductId == id).Single();    
    }    

    public IQueryable<Product> GetProducts()    {        
      return productTable;    
    } 
}

В качестве примечания следует избегать использования Single (), еслиВы уверены, что в вашей коллекции существует только один элемент.Сингл всегда будет проходить через всю вашу коллекцию.First () более эффективен в этом отношении.

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