首先,讓我道歉以免標題無意義。我很難理解我在做什麼,更不用說能夠用正確的詞來描述我在做什麼。對IQueryable執行.Select()與Func列表<T, string>代表
我建立我在其中一個頭/ 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, '僱員':
var db = new NorthwindDataContext();
var employees = db.Employees.Select(e => e);
我可以得到而從員工中提取IEnumerable<IEnumerable<string>>
這樣的(在我的觀點中使用字符串列表的列表)的工作:
var elementsList = employees.ToPagedList(PageIndex, PageSize);
var elementStringList = elementsList.ToStringList(Columns.Select(c => c.ValueExpression).ToArray());
不介意PagedList的東西,這是無關緊要的,還挺一樣ToList();
這裏的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]
正如你可能身影,這是不希望以從表中檢索員工的所有字段。
我正在尋找一種方法來在IQueryable員工上以某種方式構建擴展方法,在該方法中,我可以傳遞Func列表(「ValueExpression」列的成員)和「構建」一種新的IQuerable方式,即將執行剛剛從數據庫中檢索所需字段的SQL。
所以我在尋找這樣的事情:提前
IQueryable employees = employees.SelectByExpressions(Columns.Select(c => c.ValueExpression).ToArray());
感謝。
謝謝,從來沒有聽說過它。該頁面上有很多示例代碼,所以我可能會在那裏找到我需要的。今天晚上會檢查一下。 – 2009-05-20 06:40:11
我不相信Predicate Builder會做你想做的。它是關於動態構建謂詞(即Where子句),而您試圖動態構建Select語句。 – 2009-05-21 15:17:16