일반 함수에 대한 'select *' SQL에 해당하는 linq?
-
02-07-2019 - |
문제
linq 쿼리('항목')를 사용하고 이를 통해 추가 속성을 추가하는 일반<> 함수가 있습니다.항목 자체가 아닌 원래 '항목'의 모든 속성을 선택하려면 어떻게 해야 합니까(아래 코드처럼)?
따라서 SQL과 동일합니다.항목에서 Foo로 *, 'bar'를 선택하세요.
foreach (var item in items)
{
var newItem = new {
item, // I'd like just the properties here, not the 'item' object!
Foo = "bar"
};
newItems.Add(newItem);
}
해결책
C#의 모든 유형은 강력한 형식이므로 귀하가 사용하고 있는 익명 유형도 마찬가지이므로 귀하가 제안한 작업을 수행하는 쉬운 방법은 없습니다.하지만 떼어내는 것이 불가능한 것은 아닙니다.이를 위해서는 리플렉션을 활용하고 원하는 특정 속성이 포함된 새 모듈과 유형을 추가하여 메모리에 자체 어셈블리를 내보내야 합니다.다음을 사용하여 익명 항목의 속성 목록을 얻을 수 있습니다.
foreach(PropertyInfo info in item.GetType().GetProperties())
Console.WriteLine("{0} = {1}", info.Name, info.GetValue(item, null));
다른 팁
제가 포스팅할 내용을 정확히 쓰셨네요.방금 코드를 준비하고 있었습니다 :/
조금 복잡하지만 어쨌든:
ClientCollection coll = new ClientCollection();
var results = coll.Select(c =>
{
Dictionary<string, object> objlist = new Dictionary<string, object>();
foreach (PropertyInfo pi in c.GetType().GetProperties())
{
objlist.Add(pi.Name, pi.GetValue(c, null));
}
return new { someproperty = 1, propertyValues = objlist };
});
from item in items
where someConditionOnItem
select
{
propertyOne,
propertyTwo
};
그 물건을 당신에게 주도록 요청하십시오.
반성은 일방적이다...그러나 모든 속성은 컴파일 타임에 알려지기 때문에 각 항목에는 이 쿼리가 필요한 것을 얻는 데 도움이 되는 메서드가 있을 수 있습니다.
다음은 몇 가지 메소드 서명 예시입니다.
public XElement ToXElement()
public IEnumerable ToPropertyEnumerable()
public Dictionary<string, object> ToNameValuePairs()
Department 클래스 컬렉션이 있다고 가정합니다.
public int DepartmentId { get; set; }
public string DepartmentName { get; set; }
그런 다음 다음과 같이 익명 유형을 사용하십시오.
List<DepartMent> depList = new List<DepartMent>();
depList.Add(new DepartMent { DepartmentId = 1, DepartmentName = "Finance" });
depList.Add(new DepartMent { DepartmentId = 2, DepartmentName = "HR" });
depList.Add(new DepartMent { DepartmentId = 3, DepartmentName = "IT" });
depList.Add(new DepartMent { DepartmentId = 4, DepartmentName = "Admin" });
var result = from b in depList
select new {Id=b.DepartmentId,Damartment=b.DepartmentName,Foo="bar" };
제휴하지 않습니다 StackOverflow