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

c#中没有设置对象属性

我认为您的问题可能是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,它就会显示为真。你能把你的整个代码贴出来吗,也许有我们在代码片段中没有看到的副作用…