MVC和实体框架 - 如何从多个表/导航属性中选择列值

时间:2013-01-06 22:17:22

标签: asp.net-mvc entity-framework linq-to-entities

我是使用MVC和LINQ to Entity的新手。我不知道如何从多个表中选择列值,并为每个表定义导航属性。

以下是表格的结构:

表:MasterTable
字段:MasterID(PK),CaseNumber,Status,[OtherFields ....]
导航属性:DetailsTable,客户端

表:详情表 字段:DetailsID(PK),MasterID(FK),InsuranceId(FK),DetailsS​​tatus
导航属性:MasterTable,保险

表:客户
 字段:CustID(PK),CustFName,CustFName,Address_id,Phone_id,MasterID(FK)
导航属性:订单,地址,电话

表:保险
字段:InsuranceId(PK),InsuranceName,Address1,Address2,ZipCode,State
导航属性:Customers,DetailsTable,Addresses

表:地址
字段:Address_id(PK),Address1,Address2,ZipCode,State
导航属性:状态

表:国家
字段:State_id(PK),StateAbbrev
导航属性:国家/地区

表:手机
字段:Phone_id(PK),Home,Work,Mobile

我如何能够提取详细数据:
- CaseNumber,MasterTable的状态
- InsuranceName,Address1,Address2,ZipCode,保险表中的状态(基于DetailsTable中的InsuranceId
- DetailsTable中的DetailsS​​tatus - 来自Customers表的CustFName,CustFName,Address1,Address2,ZipCode,State(*基于Customers.MasterID = MasterTable.MasterID *)

感谢。

1 个答案:

答案 0 :(得分:1)

这只是投影,看起来像:

var query = from master in dbContext.MasterTables
            select {
                master.CaseNumber,
                master.Status,
                Details = master.DetailTables.Select(detail => new {
                    detail.DetailStatus,
                    detail.Insurance.InsuranceName, 
                    detail.Insurance.Address1,
                    detail.Insurance.Address2,
                    detail.Insurance.ZipCode,
                    detail.Insurance.State 
                },
                Customers = master.Clients.Select(customer => new {
                    customer.CustFName,
                    customer.CustLName,
                    customer.Address.Address1,
                    customer.Address.Address2,
                    customer.Address.ZipCode,
                    customer.Address.State
                }
            };

我不确定它是否正是您想要的,但它应该会让您知道如何进行此类查询。此查询使用匿名类型进行投影,但您也可以使用自定义视图模型。

您也可以这样做:

var query = dbContext.MasterTables
                     .Include(m => m.Clients)
                     .Include(m => m.DetailsTables.Select(d => d.Insurance));

它只会将所有相关客户,详细信息和保险的主数据加载。之后,您可以在代码中进行投影或直接在视图中使用您的实体。

它会