Учитывая шаблон, который вы используете, я думаю, что хорошая ментальная модель для вас будет следующее:
Product
представляет собой строку в базе данных - это обычный старый C# объект (POCO) ничего особенно умный об этом. Это просто коллекция Авто-свойств, как и в вашем примере.
ProductDa
должно быть там, где происходит доступ к данным. Чтобы выяснить, поступаете ли вы на данные, вы должны спросить себя: «Я буду запрашивать базу данных для реализации этого метода?» или «буду ли я использовать Dapper для реализации этого метода?» Если да, то взаимодействие с базой данных идет в этом классе и его методах.
Что касается использования метода LINQ Count()
или его комплекта: на уровне доступа к данным вы, вероятно, должны избегать связывания своего собственного метода для Count()
. Уровень доступа к данным должен быть абстрагирован от деталей того, как вы запрашиваете базу данных; дальнейшие манипуляции потребителями вашего уровня доступа к данным (Count
, Any
, First
и т. д.) в порядке. Кроме того, поскольку вы уже возвращаете List<Product>
, у вас есть доступ к объекту List.Count
, поэтому для абонентов тривиально.
Учитывая все, что я хотел бы изменить свой ProductDa
класс следующим образом
public class ProductDa
{
//CRUD operations using Dapper
public List<Product> GetAllElements();
//query database using Dapper to get all the elements where Value == value
public List<Product> GetAllElementsWithValue(int value);
}
и потреблять класс следующим образом, чтобы получить число Product
с возвратятся
var dataAccess = new ProductDa();
var threeValuedItems = dataAccess.GetAllElementsWithValue(3);
int numberOfItems = threeValuedItems.Count;
или, поставить более сжато :
var dataAccess = new ProductDa();
var numberOfItemsWithValueThree = dataAccess.GetAllElementsWithValue(3).Count;
Что делать, если мне нужно использовать этот LinQ много раз? Разве не лучше иметь его в одном месте, чтобы я мог также его протестировать? – SilentRage47
Репозиторий является частью DAL, поэтому «Репозиторий вместо DAL» не очень точное предложение. Кроме того, ReturnCountValue может быть методом репозитория. –
@MaximKosov Вы правы. Я хотел бы сказать «общий» репозиторий. –