4

我有两个课程:

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

public class Answer
{ .. }

在我的 Linq2Sql 设计器中,设计器上有两个 L2S 对象,它们之间有正确的 0<->many 箭头。科尔。

我不确定如何在一次调用中检索这些问题/答案并填充我的 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

4 回答 4

8

如果您的 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 文档)。

编辑

你是对的 - 因为你的 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(),
       }
于 2008-12-16T07:41:44.840 回答
2

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

关联可以是惰性的或提前加载的;DataLoadOptions默认情况下,惰性(即在第一次需要时加载)-但是要使用/强制它提前加载LoadWith()-请参见此处。要从 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意味着当 aCustomer被加载时,它们Orders会同时被获取。如果您知道需要哪些相关数据,这将很有用。如果没有这个,它将执行另一个 TSQL 查询 *per Customer** 以获取此数据(但仅当/当您要求时)。

于 2008-12-16T07:56:21.410 回答
0

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

return (from q in _db.Questions
        select q).ToList();
于 2008-12-16T08:08:34.710 回答
0

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

私有 DBDataContext mDB = new DBDataContext(ConfigurationManager.ConnectionStrings["KeyFromWebConfig"].ConnectionString);

mDB.DeferredLoadingEnabled = false

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

于 2008-12-27T18:18:20.800 回答