LINQ查询和Dao层应该如何向视图返回查询?

时间:2011-02-09 10:59:55

标签: linq linq-to-sql dao

当我以前使用ADO.NET时,我曾经创建过使用连接查询填充的TableAdapter,所以例如,即使基础选择查询将产品加入到位置,产品表适配器也会有“location”列表

在LINQ中,我该如何做到这一点?我是否通过在ProductsDao类中编写LINQ查询来返回已连接查询中的列?我返回哪种类型绑定到gridview?重新调整LINQ结果的问题是我认为它会破坏ProductsDao类的一致性(这应该只返回db中的产品行)。

1 个答案:

答案 0 :(得分:2)

我认为最好的选择是定义代表您要返回的联接数据的类(例如ProductDetails),然后从数据层返回IQueryable<ProductDetails>

要返回可查询,您只需编写一个简单的LINQ查询:

public IQueryable<ProductDetails> GetProducts() {
  return from p in db.Products
         join d in db.Details on p.ID equals d.ID
         select new ProductDetails { p.Name, d.Notes };
}

这种方法有几个好处:

  • 您不是直接公开YourDataContext对象 - 它可以作为DAO类的私有字段(如果它是短暂的)保留,或者您可以根据需要创建它。

  • 您没有直接公开基础LINQ实体(例如ProductDetails),因此用户不会意外地弄乱您的数据库(除非您给他们一个方法来做到这一点) )

  • 您正在返回可查询,它只代表一个查询。当用户添加其他附加约束(例如where)时,查询将被合成,您将不会加载不必要的数据。

  • 您只能在课程中公开合理的功能 - 例如,如果您只有GetProducts方法categoryID,则您的用户只能在给定的类别(这使得无法从数据库中获取整个表)