这是我遇到的一个奇怪的问题,我有以下声明:
IEnumerable<CategoryListViewModel> categoryViewModels = categoryRepository.GetAllCategoryViewModels();
这恰好填充了一个元素。
categoryViewModels.Where(cvm => cvm.CategoryId == localId).Single().Selected = true;
然而,没有任何更新,选择仍然是错误的。如果我爆发,我可以验证CategoryId和localId是否相等:
var something = categoryViewModels.Where(cvm => cvm.CategoryId == localId).Single()
它正确返回一个viewModel。事实上,如果我进去并将局部变量“something”设置为Selected = false。它会正确更新局部变量。
我错过了一些明显的东西吗?
编辑:
public class CategoryListViewModel
{
public Guid CategoryId { get; set; }
public string CategoryName { get; set; }
public bool Selected { get; set; }
}
答案 0 :(得分:2)
我认为您的问题可能是categoryViewModels
实际上是IQueryable
- 因此当您枚举它时,它会进行数据库调用并从数据库中选择一个列表。
这意味着您创建了一个列表,然后更改该列表中一个项目的selected
。
但是......下次枚举categoryViewModels
时,会导致另一个SELECT发生 - 并且要将新列表提取到内存中。
要解决此问题,您可以尝试ToList()
:
IEnumerable<CategoryViewModel> categoryViewModels = categoryRepository.GetAllCategoryViewModels().ToList();
或者您可以通过其他方式重新组织代码,以确保只执行一个基础查询。
答案 1 :(得分:0)
这很奇怪,我有以下一些代码,它对我有用:
public static void Main()
{
var guid = Guid.NewGuid();
List<CategoryListViewModel> list = new List<CategoryListViewModel>
{
new CategoryListViewModel
{ CategoryId = guid, CategoryName = "Hi", Selected = false }
};
list.Where(cvm => cvm.CategoryId == guid).Single().Selected = true;
Console.WriteLine(list[0].Selected);
}
public class CategoryListViewModel
{
public Guid CategoryId { get; set; }
public string CategoryName { get; set; }
public bool Selected { get; set; }
}
我无法重新创建你的问题,一旦我执行LINQ,它对我来说就是真的。你可以发布你的整个代码,也许我们在代码片段中没有看到副作用......