c#中没有设置对象属性
本文关键字:对象 属性 设置 | 更新日期: 2023-09-27 18:03:28
这是我遇到的一个奇怪的问题,我有以下语句:
IEnumerable<CategoryListViewModel> categoryViewModels = categoryRepository.GetAllCategoryViewModels();
正确地填充一个元素。
categoryViewModels.Where(cvm => cvm.CategoryId == localId).Single().Selected = true;
然而,什么都没有更新,selected仍然是false。我可以验证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; }
}
我认为您的问题可能是categoryViewModels
实际上是IQueryable
-所以当您枚举它时,它会调用数据库并从数据库中选择列表。
这意味着您创建一个列表,然后为该列表中的一个项目更改selected
。
…下次枚举categoryViewModels
时,这将导致另一个SELECT发生-并将一个新列表提取到内存中。
要解决这个问题,您可以尝试ToList()
:
IEnumerable<CategoryViewModel> categoryViewModels = categoryRepository.GetAllCategoryViewModels().ToList();
或者您可以以其他方式重新组织代码,以确保只执行一个底层查询。
这很奇怪,我有以下代码位,它为我工作:
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,它就会显示为真。你能把你的整个代码贴出来吗,也许有我们在代码片段中没有看到的副作用…