2012-07-19 17 views
0

我試圖做一個可編輯的表。我有一個動態表格,列可以變得可見或不可見。我有一個額外的列與編輯按鈕。當我打這個時,我做了一個Ajax調用來獲得該行的可編輯版本。如何添加選擇到現有的Linq表達式

我的視圖模型:

public class List: IDynamicGridDataModel<View> 
{ 
    public List() 
    { 
     ColumnOptions = new ColumnOptions(); 
     ColumnOptions.SelectedColumns = new List<string>() { "Address", "ZipCode", "City", "Country" }; 
     ColumnOptions.DisabledColumns = new List<string>() { "Id" }; 

     Items = new List<View>(); 
    } 

    #region IDynamicGridDataModel<View> Members 

    public ColumnOptions ColumnOptions { get; set; } 
    public GridModel<View> GridModel { get; set; } 
    public IEnumerable<View> Items { get; set; } 

    #endregion 
} 

當項目有:

public class View 
{ 
    public long Id { get; set; } 
    public string Address { get; set; } 
    public string ZipCode { get; set; } 
    public string City { get; set; } 
    public string Country { get; set; } 
} 

我有以下擴展來創建錶行:

public static MvcHtmlString EditorRowFor<TModel, TRow>(this HtmlHelper<TModel> html, Expression<Func<TModel,TRow>> expression, IEnumerable<string> selectedColumns) 
{ 
    var metadataProvider = new DataAnnotationsModelMetadataProvider(); 
    var stringBuilder = new StringBuilder(); 

    stringBuilder.Append("<tr>"); 

    foreach (var column in selectedColumns) 
    { 
     var entityParam = Expression.Parameter(expression.ReturnType); 

     var columnLambda = Expression.Lambda(Expression.Property(entityParam, typeof(TRow), column)); 

     var selectCall = Expression.Call(typeof(Queryable), 
             "Select", 
             new Type[] { typeof(TModel), columnLambda.Body.Type }, 
             expression, 
             columnLambda); 

     html.EditorCellFor(selectCall); 

     stringBuilder.AppendLine("</td>"); 
    } 

    stringBuilder.AppendLine("</tr>"); 
    return new MvcHtmlString(stringBuilder.ToString()); 
} 

此功能從打電話給我像這樣的看法:

@Html.EditorRowFor(m => m.Items.Single(), Model.ColumnOptions.SelectedColumns); 

的EditorCellFor方法簽名:

public static MvcHtmlString EditorCellFor<TModel, TItem>(this HtmlHelper<TModel> html, Expression<Func<TModel, TItem>> expression) 

我現在的問題是與創建selectCall的。我想打一個表達式爲Lambda表達式:

m => m.Items.Single().Select(i => i.Address) 

我得到以下錯誤:

No generic method 'Select' on type 'System.Linq.Queryable' is compatible with 
the supplied type arguments and arguments. No type arguments should be 
provided if the method is non-generic. 

大多數週邊的那部分我就http://www.hanselman.com/blog/TheWeeklySourceCode47ASPNET35DynamicDataFilterRepeatersAndDynamicLinqQueryGeneration.aspx看到的代碼。

我一直在尋找整個早晨的問題,但沒有運氣到目前爲止。

回答

1

一旦你調用Single,你只能得到一個值 - Select的點是投影值序列

因此,無論使用:

m => m.Items.Single().Address 

m => m.Items.Select(i => i.Address).Single() 
+0

好一點。但是當我有m => m.Items.Single()時,如何以Linq表達式的形式獲得這些內容?它必須在Linq Expression中,因爲我想將它傳遞給Html.EditorFor <>。 – 2012-07-19 12:40:05

+1

看起來你應該使用'm.Items.Take(1).Select(...)' – 2012-07-19 14:00:43

相關問題