【问题标题】:How should LINQ queries and Dao layer return queries to the view?LINQ 查询和 Dao 层应该如何将查询返回给视图?
【发布时间】:2011-02-09 10:59:55
【问题描述】:

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

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

【问题讨论】:

    标签: linq linq-to-sql dao


    【解决方案1】:

    我认为最好的选择是定义代表您要返回的连接数据的类(例如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),因此用户不会意外地弄乱您的数据库(除非您给他们提供这样做的方法)

    • 您正在返回 queryable,它仅代表一个查询。当用户添加额外的约束(例如where)时,查询将被组合,您不会加载不必要的数据。

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

    【讨论】:

    • 太好了,感谢您的建议。那么在我的 ProductDao 类中使用此方法是一种好习惯,还是应该是不同类的方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2015-03-29
    • 2021-07-21
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多