[英]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 原始類:
[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;}
}
是的,您會將整個對象放入您的選擇語句中:
from p in Person select new
{
person = p,
DisplayName = p.Name + ", " + p.FirstName
}
免責聲明:這將選擇一個具有 1 個屬性Person person
和另一個string DisplayName
的匿名對象。 它不會初始化person.DisplayName
屬性。
另一種可能性是為類Person
適當的 getter 屬性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;
}
}
您的選擇語句將如下所示:
from p in Person select new Person(p);
您可以通過這種方式更改現有類,因此您無需顯式操作名稱,
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;}
}
沒有直接的方法可以做到這一點,如果您想選擇所有屬性,您必須這樣做,否則任何建議都可以在上面工作:
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}";
或者您可以使用實體框架並使用映射器來映射您擁有的每個對象
將您的 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.