【问题标题】:Why LINQ to Entities won't let me initialize just some properties of an Entity?为什么 LINQ to Entities 不允许我只初始化实体的某些属性?
【发布时间】:2010-04-29 01:25:01
【问题描述】:

所以我开始将 Entity Framework 4 添加到旧版 Web 应用程序 (ASP.NET WebForms) 中。

首先,我从数据库中自动生成了一些实体。我也想应用存储库模式。

有一个名为Visitor 的实体及其存储库VisitorRepository

在 VisitorRepository 我有以下方法:

public IEnumerable<Visitor> GetActiveVisitors()
{
    var visitors = 
        from v in _context.Visitors
        where v.IsActive
        select new Visitor
        {
            VisitorID = v.VisitorID,
            EmailAddress = v.EmailAddress,
            RegisterDate = v.RegisterDate,
            Company = v.Company,
            Position = v.Position,
            FirstName = v.FirstName,
            LastName = v.LastName
        };

    return visitors.ToList();
}

请注意,Visitor 的属性比这些属性多,我只是不想获取所有内容,因为有一些繁重的 TEXT 字段。

该列表随后被绑定到转发器,当尝试执行 &lt;%# Eval('EmailAddress') #%&gt; 时,它会引发以下异常。

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

A) 为什么会这样?我该如何解决这个问题?我是否需要选择一个匿名类型,然后使用它来部分初始化我的实体???我不想做一个 SELECT * 因为这里有一些我不需要的繁重的 TEXT 列

B) 为什么我看到的每个示例都使用“select new”(匿名对象)而不是初始化已知类型?除非您正在检索数据并将其显示在同一层中,否则匿名类型是无用的。据我所知匿名类型不能从方法返回?那么它们的真正意义是什么???

谢谢大家

【问题讨论】:

  • tblVisitor和Visitor是什么关系?
  • 对不起,错字。出于示例的目的,这都是访问者。

标签: c# asp.net entity-framework linq-to-entities anonymous-types


【解决方案1】:

a) 发生这种情况是因为访问者是一个实体。您可以这样说,但您将无法通过存储库中数据上下文之外的结果对象来更新数据库:

var visitors = 
    from v in _context.Visitors
    where v.IsActive
    select v;

b) 我不知道您在看什么示例,但您可以说将匿名类型的集合从数据层中的存储库传递到 GUI 不是您想要的。您可以使用自跟踪实体或数据传输对象 (DTO)。这个MSDN article 详细解释了您的选择。

【讨论】:

  • 我想我的问题还不够清楚。我知道我可以像这样选择整个实体,但我只想获取一些字段(不是 SELECT *),因为我不需要一些繁重的 TEXT 字段。我已经更新了我的问题。
  • @Tom 仍然是正确的,要仅选择几个字段,您必须 project onto 一个 非实体 类型。
  • 是的,我不知道我不能投影到实体类型上。所以我想我会创建 POCO 类来投影。
  • POCO 或匿名类型;任何一个。
猜你喜欢
  • 2011-10-28
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多