2

这些天我正在学习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 号是最简单的,看起来正是我需要的,但我知道反射是“高成本”操作,所以它让我回到这个问题的最佳方法是什么?还有其他解决方案吗?

4

2 回答 2

0

这就是我使用的:

我使用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);
于 2013-03-12T05:40:42.583 回答
0

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

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 会弄清楚如何加入。

于 2013-03-12T11:36:50.517 回答