2013-05-30 2 views
0

Я пишу слой доступа к данным в C# для поиска элементов запаса в базе данных. У меня есть такой метод, как getStockItemByStockCode (string stockCode), который достаточно прост, но как вы собираетесь писать метод поиска элемента stockItem на основе комбинации свойств?Data Access Layer найти запись на основе нескольких свойств

Например, если я передаю объект StockFilter методу и задаю свойства, которые я хочу фильтровать, как я могу создать запрос Entity Framework для этого, не запутывая его? Или я должен просто получить все записи и отфильтровать их в бизнес-слое, который мне не подходит, потому что это означает, что я верну данные, которые мне не нужны.

Это метод я использую, чтобы получить свой запас деталь инвентарный номер:

public StockDTO getStockItemByStockCode(string stockCode) 
    { 

     StockDTO stockItem = null; 

     using (var db = new DbContext()) 
     { 
      var aStock = (from stock in db.STK_MASTER 
         where stock.STOCK_CODE.Equals(stockCode) 
         select stock).Single(); 


      Mapper.CreateMap<STK_MASTER, StockDTO>(); 
      StockDTO stockDto = Mapper.Map<STK_MASTER, StockDTO>(aStock); 

      stockItem = stockDto; 

     } 
     return stockItem; 

    } 

Это метод заголовок, который я хотел бы использовать, чтобы получить свой запас деталь основанный на комбинации свойств:

public StockDTO getStockItem(StockFilter stockProperties) 

Есть ли образец или что-то, что я могу использовать для этого? Свойства предмета запаса могут включать такие вещи, как последняя дата продажи, количество проданных, диапазон цен и т. Д.

+1

Умение использовать выражение > '? – Fendy

+0

Предположим, вы хотели бы использовать StockDTO в качестве параметра запроса для соответствия элементам в источнике данных. ** Первый вопрос **: вы уверены, что у КАЖДОГО свойства StockDTO есть «нулевое значение», которое вы можете использовать для его маркировки (= «не интересует это значение свойства в поиске»)? ** Второй вопрос **: можете ли вы использовать поддельный класс QueryStockDTO для использования в качестве объекта _query_ для StockDTO? Вы можете даже использовать микромапер для обмена свойствами между ними. –

+0

Это вообще не обязательно должен быть объект DTO. Я на самом деле думаю, что теперь не может быть хорошей идеей использовать DTO, я думаю об этом. Да, я мог бы использовать какой-то объект Filter, который не является DTO и специально предназначен для запросов. Я изменил свой вопрос, чтобы использовать объект StockFilter вместо StockDTO – Asagohan

ответ

0

Я нашел это - Creating dynamic queries with entity framework.

Я считаю, что это решит мою проблему для поиска элемента запаса. Однако я могу видеть, что мой метод становится огромным, если мне нужно проверить каждое отдельное свойство, которое я, возможно, захочу отфильтровать, и сделать это для каждого объекта DAL.

Если есть лучший способ, пожалуйста, дайте мне знать.

Expression<Func<T, bool>> 

- общий шаблон хранилища справа? Будет ли это лучше, чем решение в данной ссылке с точки зрения лучшей практики и развязки кода/ремонтопригодности?

+0

Вопрос только в том случае, если вы используете сырое выражение, то вы «раскрываете» метод запроса клиенту, и это может быть не лучшим, чтобы оптимизировать сам запрос по LINQ. –

Смежные вопросы