我有以下数据库模型: 我使用Linq-to-SQL和Design Pattern Repository描述了不合时宜的页面http://www.remondo.net/repository-pattern-example-csharp/
这是一个类图:
我希望像这样进行查询,而是使用Repository Design Pattern
ExampleRepositoryDataSet data = new ExampleRepositoryDataSet();
var query = from hotel in data.Hotel
join category in data.Category on hotel.Category equals category.IdCategory
join country in data.Country on hotel.Contry equals country.IdContry
where country.Name == "Cuba"
orderby hotel.Rating descending
group new {hotel, category, country} by category.Name;
答案 0 :(得分:1)
public class HotelRepository : EFRepository<Hotel>, IHotelRepository
{
public List<IGrouping<string, Hotel>> GetAllByCountrynameOrderedByCountrynameAndGroupedByCategoryname(string categoryName, string countryName)
{
return DbSet
.Where(hotel => hotel.Country.Name.Equals(countryName))
.OrderByDescending(hotel => hotel.Rating)
.GroupBy(hotel => hotel.Category.Name)
.ToList();
}
}
答案 1 :(得分:0)
Repository
隐藏了您的ORM(Linq-2-SQL,这也是过时的,使用EF更好),即Repository包含对ORM呈现的数据集ExampleRepositoryDataSet
的引用我可以看到。Repository
通常根据Add, Delete, Edit, ListAll
方法进行描述,因此其实现可以(并且必须)使用Linq-2-SQL功能进行查询构建。这就是你在做什么。Repository
填充ListHotelsByCountryNameAndOrder(string countryName, bool isAsc)
,并按照您刚刚撰写的方式实施。{/ li>
generic repository
(有人告诉它反模式,但我不同意),你的问题会变得更加困难,但仍然可以解决。看看Specification
模式。Query Object Pattern
有点过时了。今天.NET表达似乎是一个很好的选择。对于简单过滤,您可以使用方法IEnumerable<T> ListAll(Expression<Func<T, bool>> filter)
填充存储库,并像myRepo.ListAll(t => t.Name == "Cuba")
一样使用它。对于复杂查询,它是添加新方法(3.)或使用规范(4。)的更好方法。IQueryable
。始终调用.ToList()
或其他非延迟操作来加载数据。