【问题标题】:Returning datasets from LINQ to SQL in a REST/WCF service在 REST/WCF 服务中将数据集从 LINQ 返回到 SQL
【发布时间】:2011-07-26 17:32:37
【问题描述】:

我有一个 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 };

显然,生成的行集不符合“用户”模式,因此我不能只转换为用户对象列表。

我尝试在我的对象模型中创建一个与结果集相关的新实体,但它不想进行转换。

我错过了什么?

编辑:相关问题:存储过程返回的结果如何?同样的问题,将它们打包以通过服务返回的最佳方式是什么?

【问题讨论】:

    标签: wcf linq


    【解决方案1】:

    一般来说,您不应该从服务中返回域对象,因为如果这样做,您会遇到与您所发现的问题类似的问题。域对象旨在描述问题域中的特定实体,并且通常不能很好地提供一组特定的数据以从服务调用返回。

    您最好通过创建 data transfer objects 来代表它们,将您的域实体与服务分离,其中只包含您需要传输的信息。 DTO 将具有构造函数,该构造函数获取域对象并复制所需的任何属性值(您还需要一个无参数构造函数,以便它们可以被序列化),或者您可以使用像 AutoMapper 这样的对象-对象映射器。它们还将具有不适合域对象的特定服务功能,例如 IExtensibleDataObjectDataMemberAttributes。这使您的域对象可以独立于您从服务发送的对象而变化。

    【讨论】:

      【解决方案2】:

      您可以创建Complex Type,而不是返回匿名对象,而是返回复杂类型。当您使用函数导入映射存储过程时,您可以选择自动创建复杂类型。

      使用您需要的属性创建一个自定义类:

      public class MyTimesheet
      {
          public int Id { get; set; }
          public string Data { get; set; }
      }
      

      然后从您的 Linq 查询中创建它:

      using (linkDataContext link = new linkDataContext())
      {
          var data = (from t in link.TimesheetDetails
                     select new MyTimesheet
                     {
                         Id = t.Id,
                         Data = t.EmployeeId.ToString()
                     }).ToList();
      }
      

      【讨论】:

      • 那是实体框架,而不是直接的 Linq To SQL。如果可能的话,我会尽量避免使用实体框架。
      • 哦,我明白了。您可以像 m4tt1mus 建议的那样创建一个具体的类而不是匿名类。
      • 但是...假设我确实使用实体框架。我知道复杂类型如何与存储过程一起使用,这不是问题。如何将我上面的 linq to sql 查询映射到复杂类型?我正在尝试的任何方法都不起作用。
      • 我试过了 - 我得到一个异常“无法在 LINQ to Entities 查询中构造实体或复杂类型 'MyModel.MyResult'”
      • 这对我来说似乎工作得很好。你能描述一下'MyModel.MyResult'类吗?它是你数据库中的一张表吗?
      猜你喜欢
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      相关资源
      最近更新 更多