1

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

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

4 回答 4

1

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

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

免责声明:这会选择一个具有 1 个属性Person person和另一个string DisplayName. 它不初始化person.DisplayName属性。

另一种可能性是为该类Person提供适当的属性获取器DisplayName

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

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

from p in Person select p;

如果您使用的是 Linq to SQL,那么您的类可以是部分类,您可以在此处应用第三种策略:创建另一个部分类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);
于 2018-02-20T07:18:14.377 回答
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;}
}
于 2018-02-20T07:24:44.027 回答
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}";

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

于 2018-02-20T07:53:07.147 回答
0

将您的 Person 类更改为:

[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);
于 2018-05-10T15:29:07.750 回答