为Linq to Entity引用Object Literal Instantiation中的现有属性

时间:2015-02-12 20:10:35

标签: c# entity-framework linq-to-entities entity-framework-6

public class Person
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public string FullName { get; set; }
}

var joe = new Person {
  FirstName = "Joe",
  LastName = "Smith",
  //The following line produces the error:
  //The Name FirstName does not exist in the current context
  FullName = Firstname + " " + LastName
}

如果我尝试在C#中执行此操作,则不允许我引用其他属性。

如果我这样做:

var joe = new Person ()
joe.FirstName = "Joe";
joe.LastName = "Smith";
joe.FullName = Firstname + " " + LastName;

一切都很好。

我的理解是,使用Object Literal实例化,编译器会在编译时将所有内容转换为第二个示例。

但是,在Linq to Entity中,我们必须在Object Instantiation中使用Object Literals,如下所示:

List<PersonDTO> people = dbContext.Person.Where(x => x.IsAlive)
  .Select(y => new PersonDTO
                {
                  FirstName = y.FirstName,
                  LastName = y.LastName,
                  FullName = ???
                }

我知道我可以引用y.FirstName + " " y.LastName,但会在生成的SQL查询中创建额外的代码。

虽然这是一个简单的例子,但我正在使用更大更复杂的数据集。

所以问题是:

有没有办法在Object Literal Instantiation中将属性连接在一起?

如果没有,我可以以某种方式将y传递给对象构造函数吗?

如果没有,做这样的事情的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

我在这种情况下的建议是在Person实体中使用NotMapped属性:

public class Person
{
  //..
  [NotMapped]
  public string FullName
  get
  {
    return FirstName + " " + LastName;
  }
}

答案 1 :(得分:0)

如果您正在寻找在类中创建FullName属性的方法,那么最好的方法是在项目中创建一个包含Person的部分类的类文件。

public partial class Person
{
   public string FullName
     get
     {
       return FirstName + " " + LastName
     }
}