【问题标题】:Best way for converting linq to entity query to strongly typed ObservableCollection将 linq 转换为实体查询到强类型 ObservableCollection 的最佳方法
【发布时间】:2013-03-12 19:36:50
【问题描述】:

这些天我正在学习 Entity Framework 5。 我开发了基于 MVVM 和 PRISM 的 WPF 应用程序。 为了获得属性更改通知,我使用ObservableCollection 来保存我的数据。

我在使用 linq 到实体投影时遇到问题,我不确定什么是最好的解决方案。

如您所知,当您通过 linq 对实体执行投影时,您会得到没有人知道方法范围的匿名类型。我搜索了如何使这个查询成为强类型。

我看到了一些关于这个问题的讨论,但我找不到最好的方法。

我看到了 3 种不同的解决方案:

  1. 使用查询视图
  2. 使用定义查询
  3. http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/c6b8375a-2684-4020-bbcc-24433baf997b

数字 3 是最简单的,看起来正是我所需要的,但我知道反射是“高成本”操作,所以它让我回到这个问题的最佳方法是什么?还有其他解决方案吗?

【问题讨论】:

    标签: wpf linq-to-entities observablecollection


    【解决方案1】:

    您不应投影到匿名类型,而应投影到命名类型。

    var query = from c in Customers 
                join o in Orders on c.CustomerID equals o.CustomerID
                select new OrderDto {
                                        customer_name = c.CompanyName,
                                        order_date = o.OrderDate,
                                        order_Id = o.OrderID
                                    };
    

    它使用一个简单的类OrderDto。所以这不是你的选择。

    旁注:您可能可以使用导航属性:

    var query = from o in Orders
                select new OrderDto {
                                        customer_name = o.Customer.CompanyName,
                                        order_date = o.OrderDate,
                                        order_Id = o.OrderID
                                    };
    

    EF 会弄清楚如何加入。

    【讨论】:

    • 您好,感谢您的回答。我会在 4-5 小时内尝试并报告。我想知道,您如何将此方法与解决方案 3 进行比较?比“反射解决方案”好吗?
    • 国际海事组织,是的。具有反射的解决方案缓慢且不必要地复杂。我认为只有在绝对别无选择的情况下才应该使用反射。
    • 谢谢,这正是我要找的
    【解决方案2】:

    这是我用的:

    我用VB:

    Dim ObjectQuery As IQueryable(Of YourObject) = CType((From c In YourContext.objects Select c), IQueryable(Of YourObject))
    Return New ObservableCollection(Of YourObject)(ObjectQuery)
    

    上面的简单版本基于 C# 中的客户端表,没有 CType。我使用了一个 vb 到 C# 的转换器,所以它可能需要调整

    IQueryable<client> ClientQuery = from c in ftcContext.clients select c;
    return new ObservableCollection<client>(ClientQuery);
    

    【讨论】:

    • m C# developer. What is "YourObject"? I dont 有此投影的特定对象,此投影返回我的其他实体的混合列
    • yourobject 是实体框架实体的名称。因此,如果您的数据库中有一个名为 client 的表,它将如下所示: Dim ClientQuery As IQueryable(Of client) = CType((From c In ftcContext.clients Select c), IQueryable(Of client)) Return New ObservableCollection(Of客户端)(客户端查询)
    • @OFir Of X 是 C# 通用语法 &lt;X&gt; 的 VB 语法。你需要某种强大的类。
    • 但如果我使用“join”进行投影,我会返回来自不同实体的混合列。例如,看下一个查询:“var query = from c in Customers join o in Orders 上 c.CustomerID 等于 o.CustomerID 选择新 {customer_name = c.CompanyName,,                                           ‘ ; "你的建议如何解决?
    猜你喜欢
    • 2012-11-30
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2023-03-11
    相关资源
    最近更新 更多