我有一个 WCF/REST Web 服务,我正在考虑使用 Linq to SQL 从中返回数据库信息。
对表进行基本查询并返回行很容易,例如:
[WebGet(UriTemplate = "")]
public List<User> GetUsers()
{
List<User> ret = new List<User>(); ;
using (MyDataContext context = new MyDataContext())
{
var userResults = from u in context.Users select u;
ret = userResults.ToList<User>();
}
return ret;
}
但是如果我想从多个表中返回数据或者与表的模式不完全匹配怎么办?我不知道如何从这个查询返回结果,例如:
var userResults = from u in context.Users
select new { u.userID, u.userName, u.userType,
u.Person.personFirstname, u.Person.personLastname };
显然,生成的行集不符合“用户”模式,因此我不能只转换为用户对象列表。
我尝试在我的对象模型中创建一个与结果集相关的新实体,但它不想进行转换。
我错过了什么?
编辑:相关问题:从存储过程返回的结果呢?同样的问题,将它们打包以通过服务返回的最佳方法是什么?
最佳答案
一般来说,您不应该从服务返回域对象,因为如果这样做,您会遇到类似您所发现的问题。域对象旨在描述问题域中的特定实体,通常不适合提供一组特定的数据以从服务调用中返回。
您最好通过创建 data transfer objects 将域实体与服务分离。代表它们,其中仅包含您需要传输的信息。 DTO 将有构造函数,它们接受域对象并复制所需的任何属性值(您还需要一个无参数构造函数以便它们可以被序列化),或者您可以使用像 AutoMapper 这样的对象-对象映射器。 .它们还将具有特定于服务的功能,例如 IExtensibleDataObject和 DataMemberAttributes不适合域对象。这使您的域对象可以独立于您从服务发送的对象而变化。
关于wcf - 在 REST/WCF 服务中将数据集从 LINQ 返回到 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6834085/