我有两个班级:
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! :)
};
}
想法?
感谢您的回复,但目前还不是100%。
首先,我正在返回一个POCO类,而不是Linq2Sql上下文类。这就是我正在做的原因......
select new Question { .. };
该类是POCO,而不是linq2sql。
其次,我喜欢那些指向做Answers = q.Answers.ToList()的答案,但这也行不通,因为它试图将Linq2Sql类设置为POCO类。
答案 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查询都会获取子对象。当然,您可能希望根据需要打开和关闭此功能,以最大限度地降低性能影响。