为什么在SelectList中添加Selected值会导致模型更改/迁移错误?

时间:2016-05-03 12:45:16

标签: c# entity-framework

以下代码可完美地用于创建我的类别的SelectList

 var categoryList = _context.Category.Select(f => new SelectListItem
 {
    Value = f.ID.ToString(),
    Text = f.CategoryName
 });

现在,我想在编辑项目时使用当前类别默认SelectList

 var categoryList = _context.Category.Select(f => new SelectListItem
 {
    Value = f.ID.ToString(),
    Text = f.CategoryName,
    Selected = (f.ID == itemModel.category.ID)   // <- added this line
 });

但是我收到了这个错误:

enter image description here

如果我只是将其快捷方式用于测试目的:Selected = (true)代码会再次运行而不会出错。

为什么添加bool检查f.ID == itemModel.category.ID会导致模型更改?左手和右手值均为int。我该如何解决这个问题?

P.S。只是为了咧嘴笑,我尝试添加一个迁移,但我仍然得到同样的错误。

2 个答案:

答案 0 :(得分:1)

这是因为EF无法在SQL中翻译该表达式。

最简单的方法是使用其构造函数重载创建SelectList,如:

    function olLiTree($tree)
{
    echo '<pre>';
    foreach($tree as $key => $item) {
        if (is_array($item)) {
            echo '<pre>'. $key ;
            olLiTree($item);
            echo '</pre>';
        } else {
            echo '<pre>' . $item. '</pre>'; 
        }
    }
    echo '</ul>';
}

print(olLiTree($results));

答案 1 :(得分:1)

LINQ-to-SQL总是尝试从子句,语句和条件构建SQL查询,然后运行该查询。但在这种情况下,它无法将您的代码转换为SQL,因为代码引用了在该上下文中不可用的对象。

<强>解决方案:
_context.Category.Select(...)替换为_context.Category.ToList().Select(...)

现在,在对象列表上而不是在数据库上评估条件。