>

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


  • 답변 # 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; }        
    }
    
    

    값에 액세스하려고 할 때마다 원하는 값으로 속성을 초기화합니다. 그리고 당신은 문장을 선택하는 것이 매우 간단 해집니다 :

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

  • 답변 # 2

    이러한 방식으로 기존 클래스를 변경할 수 있으므로 이름을 명시 적으로 조작 할 필요가 없습니다

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

  • 답변 # 3

    직접 모든 방법을 선택할 수 없습니다. 모든 속성을 선택하려면이 방법으로 수행해야합니다. 그렇지 않으면 제안 사항이 위와 같이 작동합니다.

    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를 사용하여 매퍼가 가지고있는 각 객체를 매핑하도록 할 수 있습니다

  • 답변 # 4

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

관련 자료

  • 이전 Python requests - 파이썬 요청 - put은 파일 업로드를 무시합니다
  • 다음 python - 보케 플롯 크기를 동적으로 맞추는 방법