如何添加选择到现有的Linq表达式

时间:2012-07-19 12:27:35

标签: asp.net-mvc linq linq-expressions

我正在尝试制作可编辑的表格。我有一个动态表,列可以是可见的或不可见的。我有一个带编辑按钮的额外列。当我点击这个时,我会进行Ajax调用以获得该行的可编辑版本。

我的观点模型:

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表达式创建一个Expression:

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 个答案:

答案 0 :(得分:1)

一旦你打电话给Single,你只能得到一个值 - Select的目的是投射一个序列的值。

所以要么使用:

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

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