우선, 제목이 맞지 않을 경우를 대비하여 사과 드리겠습니다. 나는 내가하고있는 일을 설명하는 데 적합한 단어를 사용할 수는 없지만, 내가하고있는 일을 이해하는 데 어려움을 겪고있다.Func 목록으로 IQueryable에서 .Select() 수행
내가 헤더/LINQ 표현 조합에 의해 열을 정의하는 일반적인 그리드 클래스를 짓고 있어요 :
public class Column<T>
{
public string Header { get; set; }
public Func<T, string> ValueExpression { get; set; }
}
사용법 :
Columns = new List<Column<Employee>>
{
new Column<Employee> {Header = "Employee Id", ValueExpression = e => e.EmployeeID.ToString()},
new Column<Employee> {Header = "Name", ValueExpression = e => e.FirstName + " " + e.LastName},
new Column<Employee> {Header = "Employee Birthday Year", ValueExpression = e => e.BirthDate.HasValue ? e.BirthDate.Value.Year.ToString() : ""}
},
내가 투사 할 ValueExpression의 (Func<T, string>
)를 IQueryable 'employees'에 추가하십시오.
var db = new NorthwindDataContext();
var employees = db.Employees.Select(e => e);
)합니다 (PagedList 물건을 신경 쓰지 마
var elementsList = employees.ToPagedList(PageIndex, PageSize);
var elementStringList = elementsList.ToStringList(Columns.Select(c => c.ValueExpression).ToArray());
, 그것은 무관와 ToList 등 좀 동일합니다; 직원에서이 같은 (내보기에 사용되는 문자열 목록의 목록을)를 IEnumerable<IEnumerable<string>>
를 추출하는 동안 작업을
여기에 ToStringList() 메소드의 확장 :
public static IEnumerable<IEnumerable<string>> ToStringList<T>(this IPagedList<T> enumerable, params Func<T, string>[] fields)
{
foreach (var element in enumerable)
yield return element.ToStringList(fields);
}
private static IEnumerable<string> ToStringList<T>(this T element, params Func<T, string>[] fields)
{
foreach (var field in fields)
yield return field(element);
}
문제는이 방법이 리턴되어야하는 필드를 지정하기 전에 실행 된 IQueryable을 포함한다는 것이다. 그 결과
은, 다음 쿼리는 어딘가에 길을 따라 실행됩니다 : 당신이 알 수 있듯이,이 테이블 종업원의 모든 필드를 검색하기 위해 바람직하지SELECT [t0].[EmployeeID], [t0].[LastName], [t0].[FirstName], [t0].[Title], [t0].[TitleOfCourtesy], [t0].[BirthDate], [t0].[HireDate], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[HomePhone], [t0].[Extension], [t0].[Photo], [t0].[Notes], [t0].[ReportsTo], [t0].[PhotoPath]
FROM [dbo].[Employees] AS [t0]
.
필자는 List of Func (Column의 "ValueExpression"멤버)을 전달하고 새로운 IQuerable을 "빌드"할 수있는 IQueryable 직원들에게 확장 메소드를 구축하는 방법을 찾고 있습니다. 데이터베이스에서 필요한 필드를 검색하는 SQL을 실행합니다.
그래서 나는 이런 식으로 뭔가를 찾고 있어요 : 사전에
IQueryable employees = employees.SelectByExpressions(Columns.Select(c => c.ValueExpression).ToArray());
감사합니다.
감사합니다. 들어 본 적이 없습니다. 해당 페이지에 많은 샘플 코드가 있으므로 필요한 정보를 찾을 수 있습니다. 오늘 저녁에 확인해 볼께. –
나는 Predicate Builder가 당신이 원하는 것을 할 것이라고 생각지 않는다. Select 문을 동적으로 작성하려고 할 때 동적으로 술어 (Where 절)를 동적으로 작성하는 것입니다. –