令人费解的问题 - C#Lambda代表消失后

时间:2011-09-26 22:24:54

标签: c# .net linq

我现在无法发布一个完整的工作示例,但我希望有人能够知道这里可能会发生什么。 (如果没有人可以解释发布的内容可能会发生什么,我会尝试在今晚晚些时候将一个小样本的样本折叠起来)

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只进行比较,函数内没有任何变化。)

2 个答案:

答案 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表达式或委托无关 - 如果你有任何其他类型的属性没有存储在数据库中,那么它也会“丢失”。