基于Entity Framework的ASP.net, 该怎么定义多表查询web api的对象类型

基于Entity Framework的ASP.net, 该如何定义多表查询web api的对象类型?
服务器端有三个表:Login表用于用户登录验证,UserLocation表用于存储用户位置信息,UserDetail表用于存储用户详细信息,这三个表通过Entity Framework自动生成了实体类。目前要让web api返回某UserId附近的其他用户的用户名、位置,电子邮件和性别,该如何定义这个web api的返回类型?我考虑了两种方案,一种是定义一个新类,包括{ UserId,UserName, Longitude,Latitude,Height,Email,Sex }字段,以这个新类的类型作为web api方法的返回值类型;二是写两个web api方法,一个web api方法返回UserLocation对象(该对象嵌套Login对象),另一个web api方法单独返回UserDetail集合对象。手机客户端先通过第一次查询,得到满足条件的UserID集合,然后在把这个UserID集合作为参数调用第二个web api方法,返回所需要的用户详细信息集合,再在客户端把用户名与用户详细信息对应上。
个人感觉第一个方法破坏了Entity Framework自动生成了实体类的简洁,第二个方法又极大的增大了客户端编程的工作量。不知有没有更好的办法?谢谢!

Login表:
UserId(自增加),UserName(用户名),Password

UserLocation表:
UserLocationID(自增加),UserId(Login表外键),Longitude,Latitude,Height,UpdatedTime

UserDetail表:
UserDetailID(自增加),UserId(Login表外键),Email,Birthday,Sex

------解决思路----------------------
个人建议第一种,没什么破坏不破坏的,你新建的类是对应你响应结果的,是业务需要,跟EF实体无关
------解决思路----------------------
1、果断的根据客户端一次请求的数据来定义新类,所以,就打破了你所谓的不“破坏”,那么你可以将Login表跟UserDetail表合在一个表中。Login表跟UserLocation表是一对多的关系吗?不是的话,三表合一。
2、解释上面的你所谓的“破坏”性做法,譬如很多时候客户端所请求的数据并不是仅仅从一张表中取得,这些分开的表多数是一对多的关联表,所以需要关联查询,这样的话,结果字段将是分属在多个表中,对于这样的结果你用自定义的类或结构只做一次”通信“的做法是恰当的,如果以后进行分层开发的话,你就会有更深刻的认识了。
------解决思路----------------------
第一种不是破坏,而是良好的隔离。把EF的实体模型直接通过webapi暴露出去是不明智的,趁早隔离开。系统大一点就会有很多在边界上的数据模型转换,觉得麻烦可以用 AutoMapper 之类的工具来转。
------解决思路----------------------
这里你可能要明白3点,隔离级别、单体特性、无侵入性。
另外说说与之相关的:
model是泛指,就一般c#面向对象编程来说,你至少需要理解和定义3个类别,entity:数据库表直接映射到实体,这是一一对应,根据你数据来的。dto:领域模型中的数据传输对象,一般业务在最终和db交互时用dto来转。而做这个工作而已自己手动写工具或小软件生成,也可以用类似automapper的库。web前端到服务端的arg对象(可称web param),
------解决思路----------------------
这个很好办。知道域驱动编程么?其中讲到的一点就是,一次性返回DTO的数据。DTO数据格式怎么定,自行谷歌。
------解决思路----------------------
引用:
这里你可能要明白3点,隔离级别、单体特性、无侵入性。
另外说说与之相关的:
model是泛指,就一般c#面向对象编程来说,你至少需要理解和定义3个类别,entity:数据库表直接映射到实体,这是一一对应,根据你数据来的。dto:领域模型中的数据传输对象,一般业务在最终和db交互时用dto来转。而做这个工作而已自己手动写工具或小软件生成,也可以用类似automapper的库。web前端到服务端的arg对象(可称web param),



引用:
这个很好办。知道域驱动编程么?其中讲到的一点就是,一次性返回DTO的数据。DTO数据格式怎么定,自行谷歌。




非常赞同.  我也知道什么各种理论.反正写着写着就这样写了        DTO对象
Entity是与数据库一一对应的  但是在实际应用上  可以多出来一个DTO的对象.也就是在一个视图可能就有一个 或者多个DTO
------解决思路----------------------
同意4楼,model还可以分 贫血模型 和 richModel
------解决思路----------------------
第二种方法考都不考虑,不光客户端(特别你这个客户端还是手机)要分别取两次体验差,还有你是直接把数据库字段暴露出来。客户端更想要的是符合自己的viewModel