Linq选择所有和附加的计算字段

时间:2018-02-20 07:14:19

标签: c# sql linq select linq2db

我想生成一个类似于sql 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原始类:

[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;}
}

3 个答案:

答案 0 :(得分:1)

是的,你会将整个对象带入你的select语句:

result[-1] = result[-1][:-1]

免责声明:这会选择一个包含1个属性from p in Person select new { person = p, DisplayName = p.Name + ", " + p.FirstName } 和另一个Person person的匿名对象。它不会初始化string DisplayName属性。

另一种可能性是为类person.DisplayName提供属性Person的正确吸气剂:

DisplayName

每次尝试访问它的值时,它都会使用所需的值初始化该属性。而你选择语句变得非常简单:

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

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

Person

你的select语句如下所示:

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;
    }
}

答案 1 :(得分:0)

您可以通过这种方式更改现有课程,因此您无需明确操作该名称,

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;}
}

答案 2 :(得分:0)

没有直接的方法可以做到这一点,如果您想要选择所有属性,您必须这样做,或者上述任何建议都可以使用:

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}";

或者您可以使用实体框架并使用映射器来映射您拥有的每个对象