我有以下数据库模型: 在此处输入图片说明 我使用Linq-to-SQL和Design Pattern Repository来描述下面的页面http://www.remondo.net/repository-pattern-example-csharp/

这是一个类图:

在此处输入图片说明

我想进行这样的查询,但改为使用存储库设计模式

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;

===============>>#1 票数: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();
     }
}

===============>>#2 票数:0

  1. Repository隐藏了您的ORM(Linq-2-SQL,这也已经过时,最好使用EF),也就是说,Repository包含对ORM表示的数据集ExampleRepositoryDataSet引用。
  2. Repository通常用Add, Delete, Edit, ListAll方法来描述,因此其实现可以(必须)使用Linq-2-SQL功能进行查询构造。 这就是你在做什么。
  3. 您可以使用方法ListHotelsByCountryNameAndOrder(string countryName, bool isAsc)填充Repository ,并以您刚刚编写的方式实现它。
  4. 如果您要使用generic repository (有人告诉它是反模式的,但我不同意),您的问题将变得更加困难,但仍然可以解决。 看一看Specification模式。
  5. 最后, Query Object Pattern有点过时了。 今天,.NET表达式似乎是一个不错的选择。 为了进行简单过滤,您可以使用IEnumerable<T> ListAll(Expression<Func<T, bool>> filter)方法填充存储库,并像myRepo.ListAll(t => t.Name == "Cuba")一样使用它。 对于复杂的查询,这是添加新方法(3.)或使用规范(4.)的更好方法。
  6. 不要从存储库返回IQueryable 始终调用.ToList()或其他非延迟操作来加载数据。

  ask by Cyberguille translate from so

未解决问题?本站智能推荐:

2回复

存储库模式实施经验

我准备开始一个新的asp.net Web项目,并且要使用LINQ-to-SQL。 我已经完成了一些工作,使用Mike Hadlow发现的一些信息来设置数据层,该信息使用接口和泛型为数据库中的每个表创建一个存储库。 我一开始认为这是一种有趣的方法。 但是,现在我认为创建一个基本的Reposi
1回复

存储库模式和LinqToSql方法

我有一个封装linq到sql数据上下文的对象。 它具有方法IQuerable<T> FromStore<T> ,该方法允许我通过linq到sql从相应的表中获取实体。 我也有通过方法调用数据上下文中的函数的方法。 我现在遇到的问题是我无法在where子句
2回复

我将如何设计一个存储库来处理多种数据访问策略?

对于能够使用ASP.NET MVC和C#支持多个数据库层的存储库,框架设计会是什么样? 我想看看如果我同时支持LINQ to SQL和NHibernate,设计将是什么样。 如何创建数据库对象,并在BLL层中调用该方法?
1回复

如何设计Repository模式以便以后轻松切换到另一个ORM?

我是存储库模式的新手,但我尝试过,我的目标是制作一个设计,让我可以轻松地使用一些编辑“依赖注入或配置编辑”,以便能够切换到另一个ORM而无需触及其他解决方案层。 我达到了这个实现: 这是代码: 我的aspx页面中的用法: 正如您在前面的代码中看到的那样,我现在正在使用
1回复

LINQ:在1 IQueryable中返回2个SELECT进行分页吗? 与存储库模式保持一致,并且不更改返回类型

是否可以用1个Iqueryable返回2个选择? 我有一个基本上返回一些记录的方法,但是我将其用于分页,因此我还需要返回TOTAL条记录的数量。 它正在工作,但不是创建具有2个属性的具体类(1个用于计数,1个用于我的选择),我宁愿使用IQueryable,但不确定它是否会起作用。
1回复

实体框架存储库模式继承

现在,对于B和C拥有一个单独的存储库是有意义的,还是应该将类型信息传递给A的存储库中的方法,然后从那里返回内容。 我选择另一个存储库的原因是如果我想要 这可能开始变得混乱和棘手。 那么最好的方法是什么?
2回复

在LINQ to SQL存储库中设置上下文

我正在尝试使用LINQ to SQL数据上下文来实现通用存储库模式。 上下文以NULL表示。 为了获得上下文并使其起作用,需要进行哪些更改? 我有一个dbml文件,其中包含以下内容: 它具有帐户实体 码 读: LinqToSql声明并实例化DataCon
1回复

通用存储库Linq2Sql阻抗不匹配问题

我正在研究API如下的存储库模式: 其中visitor是一个域对象,x表示该域对象。 存储库中Find方法的方法签名为: 直到我尝试将其与Linq2Sql一起使用,这一切都是奇妙的,因为linq2sql创建了自己的对象,因此在我想调用时: 类型不匹配,因为linq2sq
3回复

使用LINQ存储库时使用Func T,bool的可能方法

我发现了许多使用LINQ to SQL的通用存储库的示例。 但是,关于如何调用这些函数的示例还不够多。 您能否提供一个有关客户端如何使用以下功能的示例? 注意:我的问题是关于Func T,bool的使用 。 有什么可能的使用方式 ? 注意:BankAccount是一个实体。
1回复

构造一个linq查询以获取关联

我有2个表,Category和ProductCategory。 一个产品可以有多个类别: 类别 CategoryId CategoryName 1 电子 2 电子阅读器 3 片 产品分类 类别 编号产品编号 1 100 2 100 3 100