gpt4 book ai didi

c# - "new"inside concrete type projection 只被调用一次

转载 作者:可可西里 更新时间:2023-11-01 08:27:40 27 4
gpt4 key购买 nike

我有简单的 Linq2Sql 查询:

var result = from t in MyContext.MyItems
select new MyViewModelClass()
{
FirstProperty = t,
SecondProperty = new SomeLinq2SqlEntity()
}

问题是 new SomeLinq2SqlEntity() 似乎只对该序列执行一次,因此查询结果中 MyViewModelClass 的所有实例共享链接到一个对象。

更新:这是我快速检查它的方法:

result[0].SecondProperty.MyField = 10;

使用调试器,我可以检查 MyField 在所有情况下都设置为 10

当我用 foreach 替换 LINQ 查询时,它按预期工作:

  var result = from t in MyContext.MyItems select t;
var list = new List<MyViewModelClass>();
foreach (var item in result)
{
list.add(new MyViewModelClass()
{
FirstProperty = item,
SecondProperty = new SomeLinq2SqlEntity()
});
}

我还没有找到问题的根源,但是标记为 asnwer 的帖子提供了很好的解决方法。检查此 asnwer 以获取详细说明:"new" inside concrete type projection is only called once

最佳答案

这可能与您的提供程序的奇怪 IQueryable 实现有关。Aducci 的答案是使用 AsEnumerable() 调用从数据库中提取数据并对该集合执行查询,这与通过 IQueryable 执行它不同。

例如,IQueryable 构建了 ExpressionTree,它稍后会根据具体的提供者进行解析(即执行一次共享代码以进行优化),而 IEnumerable 接受 Func 并按照您的预期执行它。

您可以在这里阅读更多内容:

http://msdn.microsoft.com/en-us/vcsharp/ff963710

关于c# - "new"inside concrete type projection 只被调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6899825/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com