代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

如何从Linq2Sql查询填充POCO(子)IList属性?

  •  4
  • Pure.Krome  · 技术社区  · 17 年前

    我有两个班:

    public class Question
    {
        public IList<Answer> Answers { get; set; }
    }
    
    public class Answer
    { .. }
    

    在我的Linq2Sql设计器中,设计器上有两个L2S对象,其值为0<->他们之间有许多箭。Kewl。

    我不确定如何在一次调用中检索这些问题/答案并填充我的POCO对象。。

    这就是我得到的。…有人能填一下空白吗?

    public IQueryable<Question> GetQuestions()
    {
        return from q in _db.Questions
            select new Question
                {
                    Title = q.Title,
                    Answers = ????????   // <-- HALP! :)
                };
    }
    

    思想?

    更新:POCO战争

    谢谢你的回复,但还不是100%。

    首先,我返回的是一个POCO类,而不是Linq2Sql上下文类。这就是我这么做的原因。..

    select new Question { .. };
    

    该类是POCO,而不是linq2sql。

    其次,我喜欢那些指向做answers=q的答案。ToList(),但这也不起作用,因为它试图将Linq2Sql类设置为POCO类。

    4 回复  |  直到 17 年前
        1
  •  8
  •   Matt Hamilton    17 年前

    如果您的LINQ to SQL类之间存在关系,那么应该在“问题”LINQ to SQL类时生成“答案”属性。所以你应该能够简单地做到这一点:

    return from q in _db.Questions
           select new Question
           {
               Title = q.Title,
               Answers = q.Answers.ToList(),
           }
    

    你可以省略对ToList()的调用——我不确定LINQ to SQL对生成的相关行使用什么类型(我相信 IQueryable<T> ).

    要强制预先填充Answers属性,而不是对每个问题都进行另一个查询,您可以使用 DataLoadOptions 类。本质上,您可以告诉LINQ to SQL在任何时候查询问题时加载答案(使用LoadWith方法-请参阅MSDN文档)。

    编辑

    你是对的,自从你的问题。Answers属性是您自己的POCO列表,并为其分配q。Answers不是正确的方法。这可能会更好:

    return from q in _db.Questions
           select new Question
           {
               Title = q.Title,
               Answers = (from a in q.Answers
                         select new Answer { ... }).ToList(),
           }
    
        2
  •  2
  •   Marc Gravell    17 年前

    相关数据通常通过 EntitySet<T> 类(如果使用dbml生成的代码,则会为您创建该属性)。

    关联可以是懒惰的或早期加载的;默认情况下,它是懒惰的(即在第一次需要时加载),但要强制它尽早加载,请使用 DataLoadOptions / LoadWith() -看 here 。要复制MSDN页面中的示例,请执行以下操作:

    Northwnd db = new Northwnd(@"c:\northwnd.mdf");
    DataLoadOptions dlo = new DataLoadOptions();
    dlo.LoadWith<Customer>(c => c.Orders);
    db.LoadOptions = dlo;
    
    var londonCustomers =
        from cust in db.Customers
        where cust.City == "London"
        select cust;
    
    foreach (var custObj in londonCustomers)
    {
        Console.WriteLine(custObj.CustomerID);
    }
    

    在这里 LoadWith 意味着当a Customer 已加载,其 Orders 同时被取回。如果您知道需要哪些相关数据,这将非常有用。如果没有这个,它将执行另一个TSQL查询* 顾客 **获取此数据(但仅在您要求时)。

        3
  •  0
  •   AndreasKnudsen    17 年前

    如果您返回的问题类型与in_db的类型相同。你可以写的问题

    return (from q in _db.Questions
            select q).ToList();
    
        4
  •  0
  •   jeff jeff    17 年前

    这甚至更容易。假设您的数据库模式已规范化并包含正确的关系,只需将延迟加载切换为false:

    private DBDataContext mDB=新的DBDataContext(配置管理器.ConnectionStrings[“KeyFromWebConfig”].ConnectionString);

    mDB。DeferredLoadingEnabled=false

    现在,任何使用mDB的linq查询也将获取子对象。当然,您可能希望根据需要打开和关闭此选项,以尽量减少对性能的影响。