使用linq和EF创建对象而不定义其字段

时间:2013-12-23 12:49:52

标签: c# vb.net linq entity-framework

我有一个简单的方法,用于通过customerId从数据库中获取客户:

Public Function GetCustomer(ByVal id As Long) As Customer

        Using ctx As New MyEntities
            Dim e = (From c In ctx.customers
                    Join bp In ctx.billingpoints
                    On c.customerId Equals bp.customerId
                    Select New Customer With {
                        .customerId = c.customerId
                        .billingPoint = New BillingPoint With{
                                            .customerId = bp.customerId
                                            .billingPointId = bp.billingPointId
                                            'tons of more fields   
                                        }
                        'tons of more fields
                           })
        Return e
    End Using
End Function

此方法返回如下定义的Customer对象:

Public Class Customer
    Public Property customerId As Long
    Public Property billingPoint As BillingPoint
    'many more fields
End Class

正如您所看到的,设置所有属性看起来很糟糕。有没有更有效的方法呢?

3 个答案:

答案 0 :(得分:1)

我假设你问,因为你的对象模型不包含客户对象上BillingPoint类型的显式映射关系属性,而只是通过BillingPoint上的customerId属性在两个实体之间隐含关系。

如果你想保留这样的模型,这在许多情况下都是有效的,你可以考虑将查询结果映射到CustomerDTO类型。这可以使用AutoMapper及其可查询扩展名自动完成:

https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions

答案 1 :(得分:0)

您可以使用Entity框架已经生成的类,而无需使用属性重新创建类型,除非您需要特定类型的模型,然后您必须手动执行映射,或者编写通用扩展通过“名称”

将列映射到特定属性

答案 2 :(得分:0)

快速提示:不确定这是否有效,但您可以在Customer中添加一个构造函数,它将实体结果中的对象作为输入参数。然后你可以做类似的事情:

Select New Customer(c, bc) 

您可能必须使用As Enumerable来获得结果才能实现此目的,这意味着您需要注意不要获取和迭代比您需要的更多结果。