我现在无法发布一个完整的工作示例,但我希望有人能够知道这里可能会发生什么。 (如果没有人可以解释发布的内容可能会发生什么,我会尝试在今晚晚些时候将一个小样本的样本折叠起来)
List<CVENT.Idea> ideas = ideaDAL.GetList(filter);
foreach (CVENT.Idea idea in ideas) // Setup foreign key mapping
BuildRelationships(idea, 8);
// Breakpoint set on next line.
ideas = (from idea in ideaDAL.GetList(filter)
where IdeaSatisfiesCriteria(idea,filter)
select idea).ToList();
// I then Run To Cursor to This Line so I get a before and after the previous line.
foreach (CVENT.Idea idea in ideas) // Setup foreign key mapping
BuildRelationships(idea, 8);
return ideas;
所以我从DAL层加载了一些想法。这很好用。然后我有一个“BuildRelationships”函数,为每个想法分配一些Lambda表达式给Func委托变量。
在构建关系函数
中private CVENT.Idea BuildRelationships(CVENT.Idea idea, int userID)
{
idea.MapComments = thisIdea => commentBLL .GetList(thisIdea.IdeaID, userID).ToList();
return idea;
}
在我的想法实体
中public Func<Idea, List<Comment>> MapComments { get; set; }
这是外键映射模式的只读实现,其中我将外键的初始化注入到我的实体中,以便它可以根据需要延迟加载外部实体。
问题是在行I之后,在所有Mapping变量上设置的第一个断点被清除为null(因此第二次调用重新映射关系)。由于ToList(),我猜它有一个新列表的创建,但我不明白为什么Mapping委托变量不会被其余的属性继承。有任何想法吗?
(IdeaSatisfiesCriteria只进行比较,函数内没有任何变化。)
答案 0 :(得分:2)
ideas = (from idea in ideaDAL.GetList(filter)
where IdeaSatisfiesCriteria(idea,filter)
select idea).ToList();
所有映射都会消失,因为您正在从DAL重新查询您的想法,而不是使用您应用映射的现有列表。您可能打算执行此操作:
ideas = (from idea in ideas
where IdeaSatisfiesCriteria(idea,filter)
select idea).ToList();
答案 1 :(得分:1)
您还没有真正展示足够的代码来明确发生了什么,但是当您在此处重新分配ideas
时:
ideas = (from idea in ideaDAL.GetList(filter)
where IdeaSatisfiesCriteria(idea,filter)
select idea).ToList();
据我所知,那里没有使用ideas
中提到的所有中的先前对象......它正在创建全新的对象,为什么你会期待它可以结转任何其他财产?据推测,其他属性正在从数据库填充 - 而数据库中没有任何映射用于映射,这就是为什么你必须首先调用BuildRelationships
。
基本上,除非你的DAL是要对它创建的对象进行一些缓存,否则你要创建两个完全不同的对象列表 - 所以任何东西都不会被首先创建对象的东西填充 不会被设置。
为了清楚起见,这与lambda表达式或委托无关 - 如果你有任何其他类型的属性没有存储在数据库中,那么它也会“丢失”。