簡體   English   中英

Linq 全選和附加計算字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM