【问题标题】:Return only specified properties from an Entity Framework class仅从实体框架类返回指定的属性
【发布时间】:2016-05-21 00:46:55
【问题描述】:

我对 Entity Framework 和 MVC 非常陌生(并且还在学习 C#),所以如果我的某些术语不正确,请原谅我。

简单地说,我已经在我的 MVC 项目中安装了 Entity Framework,我希望用它来创建一个 Web API 来提供一个 XML 记录列表。 Entity Framework 创建了我的实体类。

在我的控制器中,我可以使用以下代码获取 XML 列表:

public IEnumerable<Person> GetAllPersons()
    {
        IEnumerable<Person> person;

        using (var context = new ContactsContext())
        {
            context.Configuration.ProxyCreationEnabled = false;
            person = context.People.ToList();
        }

        return person;
    }

这很棒。但是,如果我只想返回 Person 对象的某些属性怎么办?例如,如果我只需要 FirstName 和 LastName 属性怎么办?

我找到了一些使用类似

的例子
person = (from p in context.People
          select new { p.FirstName, p.LastName })

但这会带来问题。这样做意味着我的 IEnumberable 列表不再是 Person 类型的列表。如果我将类型更改为dynamic,它至少会编译,但这样做的问题是它没有成功显示在浏览器中,大概是因为 XML 反序列化器不再知道对象的结构是什么。

真的没有办法只返回我指定的对象的某些属性,同时仍然传达它实际上是我要返回的Person 对象的事实吗?而且,如果不是,我将如何以浏览器可以解释为 XML 的格式返回对象的某些属性?

【问题讨论】:

  • 如果您只发送属性的子集,您将不再发送原始对象。创建您的服务返回的视图模型,然后可以将其序列化为 xml 或 json 或您选择的任何序列化格式。
  • 所以这将是一种基于 Person 类的“派生类”?这就是我开始认为我需要的东西,但我不知道如何创建一个。
  • 这将是一个完全独立于您的领域模型人员的单独类。

标签: c# xml asp.net-mvc entity-framework


【解决方案1】:

你可以这样做:

List<Person> persons = (from p in context.People
          select new { FName = p.FirstName, LastName = p.LastName })
         .ToList()
         .Select(p=>new person() { FirstName= FName , LastName = LName });

【讨论】:

  • 我猜LastName = p.LastName 应该是LName = p.LastName?然而,这不会构建 - 最后一行中的 FName 和 LName 变量无法识别。
【解决方案2】:
List<Person> person = context.People.AsEnumerable()
                      .Select(o => new Person {
                                       FirstName = o.FirstName , 
                                       LastName = o.LastName 
                      }).ToList();

这样你就可以确定你的列表是 Person 类型的(因为如果我理解这就是你需要的)

*另外,您将 person 声明为 Enumerable,但您正在向其返回 List

【讨论】:

  • 奇怪的是,这段代码仍然返回包含 Person 对象所有属性的 XML,而不仅仅是 FirstName 和 LastName。
  • 您是否也删除了 IEnumerable 人;宣言?无论如何你都会得到一个例外,但问一下也无妨。 :) 更好的是,将其替换为 List 人员声明。
  • 是的,我完全删除了该变量。该方法现在返回类型 List,但我认为没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多