我查看了与此相关的所有示例,但未能解决我的问题。
我在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()导致问题。但我不确定如何纠正它。
感谢。
答案 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()
调用以在构建表达式之后急切地执行SQL查询,直到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)
};