Linq select 所有和附加的计算字段

Linq select all and additional calculated field

我想生成类似于 sql select 的 select 语句:

public partial class Person{
    public string Name {get;set;}
    public string FirstName{ get;set;}
    public string DisplayName {get;set;}
    public string Town{get;set;}
    public int Age {get;set;}
}

select p.*, (p.NAME + ', ' + p.FirstName) as DisplayName  from Person p

在linq中我会这样做

from p in Person select new 
{
    p.Name, p.FirstName, p.Age, p.Town, // and so on...
    DisplayName = p.NAME + ', ' + p.FirstName
}

有没有办法像 sql select 那样不用列出每个 属性?

更新:

因为我在这里使用 linqToDB 原来的 class:

[Table("PERSON")]
public class Person{
    [Column("ID"), PrimaryKey, NotNull]
    public int Id { get; set; }
    [Column("NAME")]
    public string Name {get;set;}
    [Column("FIRST_NAME")]
    public string FirstName{ get;set;}

    public string DisplayName {get;set;}
    [Column("TOWN")]
    public string Town{get;set;}
    [Column("AGE")]
    public int Age {get;set;}
}

是的,您会将整个对象放入您的 select 语句中:

from p in Person select new 
{
    person = p,
    DisplayName = p.Name + ", " + p.FirstName
}

免责声明:此 select 是一个匿名对象,其中包含 1 个 属性 Person person 和另一个 string DisplayName。它不初始化 person.DisplayName 属性.

另一种可能性是给 class Person 属性 DisplayName:

适当的 getter
public string DisplayName
{
    get { return this.Name + ", " + FirstName; }        
}

它会在您每次尝试访问它的值时使用所需的值初始化 属性。而你select语句就变得很简单:

from p in Person select p;

如果你使用 Linq to SQL 那么你的 class 可以是部分的,你可以在这里应用第三种策略:创建另一个部分 class Person 并给出它是一个接受 Person 作为参数并在那里处理初始化的新构造函数:

public partial class Person
{
    public Person(Person p)
    {
        this.Name = p.Name;
        this.FirstName = p.FirstName;
        this.DisplayName = p.Name + ", " + p.FirstName;
        this.Town = p.Town;
        this.Age = p.Age;
    }
}

您的 select 语句将如下所示:

from p in Person select new Person(p);

您可以通过这种方式更改现有的 class,因此您无需显式操作名称,

public class Person{
 public string Name {get;set;}
 public string FirstName{ get;set;}
 public string DisplayName {
    get{
         return this.Name+","+this.FirstName;
       }

 }
 public string Town{get;set;}
 public int Age {get;set;}
}

没有直接的方法可以做到这一点,如果你想select你的所有属性,你必须这样做,否则上面的任何建议都有效:

var result = yourEntity.ToList(); //If it is a list
var result = yourEntity.FirstOrDefault() //If you only want one item

然后访问您的 result 并设置 DisplayName 值:

result.DisplayName = $"{result.Name}, {result.FirstName}";

或者您可以使用 Entity Framework 并使用映射器来映射您拥有的每个对象

将您的人物 class 更改为:

[Table("PERSON")]
public class Person{
    [Column("ID"), PrimaryKey, NotNull]
    public int Id { get; set; }
    [Column("NAME")]
    public string Name {get;set;}
    [Column("FIRST_NAME")]
    public string FirstName{ get;set;}
    public string DisplayName {get;set;}
    [Column("TOWN")]
    public string Town{get;set;}
    [Column("AGE")]
    public int Age {get;set;}

    public static Person Build(Person person, string displayName)
    {
        if (person != null)
        {
            person.DisplayName = displayName;    
        }
        return person;
    }
}

用法:

from p in Person select Person.Build(p, p.Name + ', ' + p.FirstName);