当我以前使用ADO.NET时,我曾经创建过使用连接查询填充的TableAdapter,所以例如,即使基础选择查询将产品加入到位置,产品表适配器也会有“location”列表
在LINQ中,我该如何做到这一点?我是否通过在ProductsDao类中编写LINQ查询来返回已连接查询中的列?我返回哪种类型绑定到gridview?重新调整LINQ结果的问题是我认为它会破坏ProductsDao类的一致性(这应该只返回db中的产品行)。
答案 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实体(例如Product
或Details
),因此用户不会意外地弄乱您的数据库(除非您给他们一个方法来做到这一点) )
您正在返回可查询,它只代表一个查询。当用户添加其他附加约束(例如where
)时,查询将被合成,您将不会加载不必要的数据。
您只能在课程中公开合理的功能 - 例如,如果您只有GetProducts
方法categoryID
,则您的用户只能在给定的类别(这使得无法从数据库中获取整个表)