使用 EF5 Linq to Entities 作为 DAL 到 BLL 到 ObjectDataSource
Posted
技术标签:
【中文标题】使用 EF5 Linq to Entities 作为 DAL 到 BLL 到 ObjectDataSource【英文标题】:Using EF5 Linq to Entities as DAL to BLL to ObjectDataSource 【发布时间】:2013-03-13 16:37:00 【问题描述】:我在 Linq to Entites 上苦苦挣扎。我是 EF5 和 Linq 的新手。我正在用 VB.NET 编程。我一直在使用将数据集作为 DAL 返回到 BLL 中的表适配器,然后我将其链接到 ObjectDataSource。现在我从 VS2005 ASP.NET 2.0 升级到 VS2012 到 ASO,.NET 4.0 以使用 EF5,并且我已将 EF5 设置为 DAL,我正在尝试重写 BAL 以使用 Linq to Entities 转到 ObjectDataSource。我可以使用我使用外键设置的导航对多个表进行一些复杂的查询,但我不明白如何让返回类型与需要数据集的 ObjectDataSource 一起使用。
ContentQ = From ct In DAL.Contents, cd In ct.ContentDuplicateTypes, ce In ct.ContentEditors _
Where ct.ContentId = Contentid And cd.ShowOnWeb = ShowOnWeb And cd.Hide = Hide And ce.UserId = UserId And ct.websiteId = websiteid Select ct, cd, ce
例如用于返回单个表 ContentQ= From ct in DAL.Contents select ct
为什么这在下面起作用?为什么我必须使用 include 方法填充此类以将其放入具有 2 个表的一对多表的 ObjectDataSource 中?
<System.ComponentModel.DataObjectMethodAttribute(ComponentModel.DataObjectMethodType.Select, True)> _
Public Function GetContentFiles() As ContentData
Dim objContentData As New ContentData
Using _SBEF As New SBEF5
Dim objContentDuplicateType = From d In _SBEF.ContentDuplicateTypes.Include("Content") Select d
For Each objQuery In objContentDuplicateType.ToList
With objContentData
'Content
.Description = objQuery.Content.Description
.FileName = objQuery.Content.FileName
.Draft_Path = objQuery.Content.Draft_Path
.Live_Path = objQuery.Content.Live_Path
.HeaderTitle = objQuery.Content.HeaderTitle
'ContentDuplicateType
.ContentId = objQuery.ContentId
.DisplayHeader = objQuery.DisplayHeader
.OrderNumber = objQuery.OrderNumber
.ShowOnWeb = objQuery.ShowOnWeb
.Hide = objQuery.Hide
.DateCreated = objQuery.DateCreated
.ContentTypeID = objQuery.ContentTypeId
End With
Next
GetContentFiles = objContentData
End Using
End Function
【问题讨论】:
一目了然,并且不了解您的应用程序的更多信息,您可能需要将 ObjectDataSource 映射到正在返回的实体(或将实体映射到 ObjectDataSource 正在使用的对象),而不是一个数据集。我从未将 ObjectDataSource 与 DataSet 一起使用 - 仅与我编写的自定义类一起使用。 现在让我扩展这个问题。看来,在 GridView 中获取分页和排序的唯一方法是使用自定义分页和自定义排序,其中必须传入表格的 sorttag 和 MaxCount。有趣的是,来自 Table 适配器的 DataSet 会自动获取它。我想知道 Linq to Entity 开销是否与 DataSets 相同?嗯嗯 【参考方案1】:您为什么不使用EntityDataSource?
【讨论】:
EntityDataSource 仅限于单个表(实体),在查询多个表时无法工作。它锁定了编辑、插入和删除。 我看到了如何从单个实体(表)中获取数据,那么使用导航从多个表中提取的查询呢?类型是 Anomynious(sic),我是否将函数类型设置为仅 IQueryable? 如果我创建一个视图并创建一个实体,CRUD 仍然可以从 GridView 工作吗?底线我正在尝试替换我的 DAL,它使用表适配器和实体框架工作 Linq to Entities,然后为业务层类提供属性、选择、插入、删除以与 ObjectDataSource 一起使用。 任何对单个实体使用 select 语句和使用导航元素查询多个实体的 select 语句的业务类示例,然后在 ObjectDataSource 中使用? 你能举一个例子来说明查询多个表的含义吗?您可以使用多个 EDS。导航属性有助于公开相关数据。我通常使用 IQueryable 对象,但我认为还有其他选择。以上是关于使用 EF5 Linq to Entities 作为 DAL 到 BLL 到 ObjectDataSource的主要内容,如果未能解决你的问题,请参考以下文章
LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”
如果存在-UPDATE-else-INSERT 与 Linq-to-Entities?
LINQ to Entities 无法识别方法“布尔包含 [Int32]