【问题标题】:Entity Framework 4: How to code projection to a class type?实体框架 4:如何编码投影到类类型?
【发布时间】:2010-10-24 01:01:53
【问题描述】:

如果我有如下课程:

public class Customer {
    public int    id    {get;set;}
    public string name  {get;set;}
    public string line1 {get;set;}
    public string line2 {get;set;}
    public string line3 {get;set;}
    public string line4 {get;set;}
}

我只想选择 ID 和 Name 值,其余为空。

var myCustomerList = DC.Customer.Select( 
                     p => new Customer { id = p.id, name = p.name });

我收到以下错误:

The entity or complex type 'MyModel.Customer' cannot
be constructed in a LINQ to Entities query.

你会怎么做呢?我需要指定所有类的字段吗?

【问题讨论】:

  • 您找到解决问题的好方法了吗?

标签: c# linq-to-entities entity-framework-4 projection


【解决方案1】:

试试这个:

var myCustomerList = from c in DC.Customer 
                     select new { id = p.id, name = p.name };

以上将创建一个Anonymous Type

实际应用:

"var myCustomerList"

具有两个属性“id”和“name”的匿名类型。此外,“var”允许您创建隐式类型的局部变量。这意味着:

a) 您不必声明/编写类结构来保存仅具有这两个属性的类型;

b) 您也不必维护它 - 您可以更改上述查询的结构,并且“它可以正常工作”。

【讨论】:

  • 说你想返回强类型对象,而其余字段为空?我使用了您的建议,然后遍历提供新 List 的匿名对象,因此我的存储库不需要定义大量 ViewModel 类。
  • 我循环浏览了这些记录,因为我不确定域模型中有多少字段(如果它们添加更多)。
【解决方案2】:

另一种选择是创建 CustomerInfo 类型:

public class CustomerInfo
{
  public int Id { get; set;}
  public string Name { get; set; }
}

您不能将两种类型直接映射到 EF 中的同一个表,但您可以轻松地为您的信息类型创建一个视图,然后映射到该视图:

CREATE VIEW vwCustomerInfo AS SELECT Id, Name FROM Customer

然后您将 CustomerInfo 类型映射到您的视图:

public class CustomerInfoMap : EntityConfiguration<CustomerInfo>
{
  public CustomerInfoMap()
  {
    .ToTable("vwCustomerInfo");
  }
}

这样做的副作用是 EF 只会在查询数据库时检索视图中的列。通过 id 检索 CustomerInfo 时,您将获得如下 SQL:

SELECT Id, Name FROM vwCustomers WHERE id = 1

此外,只要您的视图是可更新的,您就可以从 EF 更新您的 CustomerInfo 类型,并且基础表将被更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多