【问题标题】:DomainService: .Include() on clientDomainService: .Include() 在客户端
【发布时间】:2010-12-22 14:07:40
【问题描述】:

是否有可能在我的客户端查询中包含子实体? 我正在开发一个 Silverlight 应用程序,它使用 RIA 服务、一个 DomainService 和它背后的 EntityFramework 来访问我的数据库。 为了在调用 DomainService 获取数据时获取关联实体,我必须使用 [Include] 属性修改 DomainService 的元数据,并在 DomainService 上使用 Include() 方法。 (例如 ObjectContext.Parent.Include("Child"))

但是,我觉得我的 DomainService 中的每个实体最终都有大量方法来获取关联数据的所有不同组合,因为有时我需要一个 user 和关联的 角色,有时我只想获取没有任何关联数据的用户等等......

根据一些 RIA 教程,建议使用表达式树提供的功能来修改客户端的查询。 有什么方法可以包含在客户端而不是 DomainService 的 get 方法? 我觉得这一定是使用 DomanServices 时的常见问题?!

在我的研究过程中,我偶然发现了一个类似的问题,但没有任何答案,而且有人说这是不可能的。但这个答案是在 2009 年 4 月左右发布的,从那时起,开发过程发生了很多变化。

谢谢

【问题讨论】:

    标签: silverlight entity-framework ria expression-trees domainservices


    【解决方案1】:

    您可以在服务器上查询方法。假设您在服务器上有此代码:

    public IQueryable<Employee> GetEmployeesSorted()
    {
        return from Employee emp in ObjectContext.Employees
        orderby emp.Title, emp.HireDate
        select emp;
    }
    

    你可以在客户端这样使用

    EmployeeContext context = new EmployeeContext();
    
        EntityQuery<Employee> query =
            from emp in context.GetEmployeesSortedQuery()
            where emp.SalariedFlag == true
            select emp;
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的快速答复。我知道这一点,但是加入关联实体的 Include() 方法只能直接使用 DomainService 中的 ObjectQuery 之一。关键是我不想过多地更改 DomainService 代码。最好的办法是,如果我能坚持使用生成的代码并在查询客户端执行所有修改操作。
    • @Christoph - .Include 的重点是在服务器上预先加载数据。我认为您应该做的是在调用域服务时接受要包含的一系列关联。然后服务可以急切加载。例如var empsWithOrders = domainService.GetEmployees(new[] { "Orders", "Orders.Products" })。在您的域服务中使用扩展方法转换为.Include。您可以使用枚举或复杂的泛型(我使用后者)使其更加类型安全。
    • 好的,因为我不能直接通过我对客户端的调用来包含,这对我来说似乎是一个不错的解决方法。谢谢你的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2019-04-15
    • 2013-02-27
    • 2017-07-05
    相关资源
    最近更新 更多