当前位置: 首页 > 面试题库 >

使用linq到sql后端通过WCF查询DTO对象

东方和惬
2023-03-14
问题内容

我正在一个项目中,我们需要针对WCF服务创建复杂的查询。

该服务在后端使用linq to sql并将查询投影到数据传输对象,如下所示:

    dbContext.GetQueryable()
                  哪里(x => x.Id == formatId)
                    选择(x => FormatHelper.PopulateMSFormat(x))
                    .ToList();

我想做的是在客户端指定一个查询,可以说我要查询具有某个属性或其中几个属性的所有格式。这种风格的东西:

     var asset = client.QueryForAssets()。Where(x =>(x.name ==“ Test” || x ==“ Arne”)&& x.doe ==“ john”);

我知道我无法通过WCF返回IQueryable,但是可以使用OData服务来完成类似的工作。问题是我必须返回DTO,而OData让我很容易地绑定到L2S-datacontext,这将暴露我的数据模型,而不是DTO。

那么,有没有一种对DTO进行序列化查询的好方法,该查询将有效地传播到l2s层?

我考虑过要编写自己的查询语言,但是我发现很难构建正确的表达式树作为l2s的谓词,因为没有从DTO到linq类的映射。


问题答案:

使用OData服务,您不必直接返回数据库实体。您可以简单地DTO以可查询的格式返回任何内容。然后,借助LINQ的Select()方法,您可以DTO在服务查询之前将任何数据库实体简单地转换为:

public class DataModel
{
  public DataModel()
  {
    using (var dbContext = new DatabaseContext())
    {
      Employees = from e in dbContext.Employee
                  select new EmployeeDto
                  {
                    ID = e.EmployeeID,
                    DepartmentID = e.DepartmentID,
                    AddressID = e.AddressID,
                    FirstName = e.FirstName,
                    LastName = e.LastName,
                    StreetNumber = e.Address.StreetNumber,
                    StreetName = e.Address.StreetName
                  };
    }
  }

  /// <summary>Returns the list of employees.</summary>
  public IQueryable<EmployeeDto> Employees { get; private set; }
}

您现在可以轻松地将其设置为OData服务,如下所示:

public class EmployeeDataService : DataService<DataModel>

有关完整的实现细节,请参见此主题的出色文章。一旦掌握了OData服务,它们实际上就会非常强大。



 类似资料:
  • 问题内容: 我的SQL代码如下: 等效的linq表达式是什么? 问题答案: 我第一次尝试在 来源 LINQ to SQL中的NOT IN子句

  • 问题内容: 我正在尝试在SQL Server Profiler(2005)中查看Linq生成的SQL到SQL。 我可以看到从linq到sql以外的任何其他设备发送到服务器的sql。 我敢打赌,我需要更改跟踪的事件选择,但不确定要选择什么。 我目前仅选择此选项:SQL:StmtCompleted-TextData和SPID 我既不想使用数据上下文日志记录,也不想使用SQL Debug Visuali

  • 问题内容: 我看了几个线程,但没有找到适合我目的的解决方案(至少我不知道如何实现它) 我有一个使用Linq to SQL的WCF服务,以便在我的SQL Server上检索,更新和删除对象。 我创建了一个简单的关系数据库,该数据库在“客户”和“订单”之间具有一对多的关系,在“订单”和“ OrderDetails”之间具有一对多的关系, 现在,“我的订单”中有一个CustomerID外键,而“ Ord

  • 问题内容: 我有一个带有许多字段的表。我正在尝试在asp.net中创建搜索过滤器,以便用户可以按一个或多个字段进行搜索。所以基本上我想创建一个包含4个参数的存储过程,如果它不为null,它将把参数附加到WHERE子句中。 TableExample有4列,Col1 Col2 Col3 Col4 我希望有一种方法可以用一个存储过程完成此操作,而不必为每种可能的组合创建一个。 我正在尝试类似的方法,虽然

  • 问题内容: 我正在为这个论坛进行编码,由于我是LINQ的新手,因此用户访问主页时遇到了这个问题。我想要一个显示这样的论坛列表的表: 我有以下SQL表: 谢谢… 问题答案: 如果您使用成员身份并且不想将aspnet_Users包含在dbml中,则用于显示用户名: 使发布的示例更好一点的另一项更改是在posts变量中添加orderbydescending:然后,您可以从select子句中删除重复4次的

  • 问题内容: 我有以下查询: 我想为该选项命名时如何更改标题。 问题答案: 使用这样的别名: 如果要更改列名,则不仅要为此查询使用,而且通常要使用ALTER TABLE