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);
我想生成类似于 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
:
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);