8

我查看了与此相关的所有示例,但未能解决我的问题。

我在 asp .net mvc3 中创建一个下拉列表。

我有一个返回的存储库:

    public IEnumerable<SelectListItem> GetPropertyTypeSelectList()
    {
        var propertyTypes = from p in db.PropertyType
                                orderby p.PropertyTypeDescription
                                select new SelectListItem
                                {
                                    Text = p.PropertyTypeDescription,
                                    Value = p.PropertyTypeId.ToString()
                                };
        return propertyTypes;
    }

我的视图模型如下所示:

public class AddPropertyViewModel
{
    public Property Property { get; set; }
    public IEnumerable<SelectListItem> PropertyTypes { get; set; }
    public IEnumerable<SelectListItem> FurnishedTypes { get; set; }
}

我的 HttpGet 的“创建”操作控制器如下所示:

    public ActionResult AddProperty()
    {
        AddPropertyViewModel viewModel = new AddPropertyViewModel
        {
            PropertyTypes = websiterepository.GetPropertyTypeSelectList()

        };
        return View(viewModel);
    }

视图是这样的:

    <div class="editor-label">
        @Html.LabelFor(model => model.Property.PropertyType)
        @Html.DropDownListFor(model => model.Property.PropertyType, Model.PropertyTypes)
    </div>

我收到上面的错误。从我读过的内容来看,似乎是 ToString() 导致了问题。但我不知道如何纠正它。

谢谢。

4

1 回答 1

21

LINQ to SQL 不知道如何将.ToString()调用转换为 SQL 表达式。

所以替换:

var propertyTypes = 
    from p in db.PropertyType
    orderby p.PropertyTypeDescription
    select new SelectListItem
    {
        Text = p.PropertyTypeDescription,
        Value = p.PropertyTypeId.ToString()
    };

和:

var propertyTypes = db
    .PropertyType
    .OrderBy(x => x.PropertyTypeDescription)
    .ToList()
    .Select(x => new SelectListItem
    {
        Text = p.PropertyTypeDescription,
        Value = p.PropertyTypeId.ToString()
    });

请注意.ToList()在构建表达式直到OrderBy子句之后急切执行 SQL 查询的调用,然后在完全支持表达式.ToString()的客户端(LINQ to Objects 而不是 LINQ to Entities)上执行。.ToString()

所以这里基本上我们正在构建一个 SQL 查询,直到 OrderBy 子句(包括),然后调用 .ToList 来急切地执行这个查询并在客户端获取结果集。然后我们继续使用 .Select 语句进行链接。但是我们不再做任何 LINQ to Entities 或 SQL 的东西。我们现在正在执行 LINQ to Objects,因为所有结果集现在都在内存中。在 LINQ to Objects 中执行 .ToString 不会构成任何挑战。

另一种可能性是使用SqlFunctions.StringConvert知道如何将其转换为 SQL 的内置函数。这样你就可以保持懒惰:

var propertyTypes = 
    from p in db.PropertyType
    orderby p.PropertyTypeDescription
    select new SelectListItem
    {
        Text = p.PropertyTypeDescription,
        Value = SqlFunctions.StringConvert((double)p.PropertyTypeId)
    };
于 2012-08-20T21:11:21.663 回答