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

时间:2008-12-16 07:37:18

标签: .net linq-to-sql poco

我有两个班级:

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

public class Answer
{ .. }

在我的Linq2Sql设计器中,设计器上有两个L2S对象,它们之间有正确的0&lt; - 多箭头。 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.Answers.ToList()的答案,但这也行不通,因为它试图将Linq2Sql类设置为POCO类。

4 个答案:

答案 0 :(得分:8)

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

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文档)。

修改

你是对的 - 因为你的Question.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(),
       }

答案 1 :(得分:2)

关联数据通常通过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表示加载Customer时,会同时提取Orders。如果您知道需要哪些关联数据,这将非常有用。如果没有这个,它将执行另一个TSQL查询*每Customer **来获取此数据(但仅在您要求时才这样做)。

答案 2 :(得分:0)

如果您要返回的问题类型与_db.Questions中的类型相同,则可以编写

return (from q in _db.Questions
        select q).ToList();

答案 3 :(得分:0)

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

private DBDataContext mDB = new DBDataContext(ConfigurationManager.ConnectionStrings [“KeyFromWebConfig”]。ConnectionString);

mDB.DeferredLoadingEnabled = false

现在任何使用mDB的linq查询都会获取子对象。当然,您可能希望根据需要打开和关闭此功能,以最大限度地降低性能影响。