无法识别方法'System.String ToString()'方法,并且此方法无法转换为商店表达式

时间:2012-08-20 21:06:42

标签: c# entity-framework entity-framework-4 linq-to-entities

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

我在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;
    }

我的viewmodel看起来像这样:

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()导致问题。但我不确定如何纠正它。

感谢。

1 个答案:

答案 0 :(得分: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()调用以在构建表达式之后急切地执行SQ​​L查询,直到OrderBy子句,然后在客户端上执行.ToString()(LINQ to Objects而不是LINQ to实体)完全支持.ToString()表达式。

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

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

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