未在C#中设置对象属性

时间:2011-07-22 18:34:13

标签: c# linq

这是我遇到的一个奇怪的问题,我有以下声明:

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

2 个答案:

答案 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,它对我来说就是真的。你可以发布你的整个代码,也许我们在代码片段中没有看到副作用......