处理数据库的重复linq查询应该是什么样的正确做法?

时间:2012-08-31 08:43:29

标签: c# linq entity-framework linq-to-sql

对数据库处理重复的linq查询应该是什么样的正确做法? 通过重复查询,我的意思是在我的代码中重复出现的这类查询。

示例:

我注意到我的代码在查询后再次出现:

dataContext.Users.Where(u =>u.IsActive && u.IsAdmin).OrderByDescent(u => u.Name)

我应该在哪里放置包含上述查询的方法。它应该是UserRepository(以这种方式,我可能会以上帝的课程结束这是不好的做法)?或者我应该创建类架构来处理这个问题。

我想知道你对此有何看法。您认为哪种类结构最通用且易于重用。

我记得,我可以使用商店程序作为重复查询的地方,但我不想这样做。

1 个答案:

答案 0 :(得分:1)

是的,可以位于UserRepository,但您也可以为标准化查询(创建,删除等)构建Godclass并使用Service LayerExtensions的结果来过滤GetAll()UserRepository方法的结果。

<强>更新
我试图更详细地展示它。

  1. 构建一个通用存储库,其中包含用于检索/存储数据的所有语句。
  2. 创建一个使用/发送到存储库的服务层。
  3. 添加扩展方法以过滤特定结果。 (以c#3.0为特色)
  4. 一些代码:

    // Repository (non-generic)
    private IQueryable<User> GetUser()
    {
      var results = from u in _db.Users
                    select new User
                    {
                      ID = u.ID,
                      Username = u.Username,
                      // and so on
                    };
    
      return results;
    }
    
    
    //Service Layer  
    private User GetUser(string Username)
    {
       User u = _repository.GetUser().WithUsername(username)
                                     .SingleOrDefault();
    } 
    
    // Extension Method
    public static IQueryable<User> WithUsername(this IQueryable<User> qry, string username)
    {
      return from u in qry
             where u.Username == username
             select u;
    }
    

    此方法与Rob Conerys MVC StoreFront Preview有关。其他项目的实施可能会有所不同,但这是一种方法。