2009-09-16 51 views
1

产生回报,我试图找出处理一个简单的问题的最好办法: 我有一个简单的LINQ加盟两个表。我知道如何返回一个表的类型,因为它与生成的dbml类相同。但是,如果我想从两个表中返回数据呢?是不是有办法返回并使用它们的关系?我真的必须创建另一个返回类型来从两个表中返回数据吗?仅供参考 - 我不想用其他表格对象返回输出参数;我也没有真正有兴趣返回一个匿名类型。什么是最佳实践建议?LINQ到SQL:多表连接的类型不被DBML

public IQueryable<Consumer_Question> GetQuestions(int subCategoryId) 
    { 
     //create DataContext 
     MototoolsDataContext mototoolsDataContext = new MototoolsDataContext(); 
     mototoolsDataContext.Log = Console.Out; 

     var subcategoriestag = (from subCatTag in mototoolsDataContext.Consumer_SubCategoriesTags 
           join tagQuestion in mototoolsDataContext.Consumer_TagQuestions on subCatTag.TagID equals tagQuestion.TagID 
           join question in mototoolsDataContext.Consumer_Questions on tagQuestion.QuestionsID equals question.ID 
           where subCatTag.SubCategoriesID == subCategoryId 
           orderby subCatTag.ID descending 
           select question); 
           //select new { question, tagQuestion }); 

     return subcategoriestag; 
    } 

感谢您的帮助,

回答

1

如果定义在LINQ到SQL设计你的人际关系那么你上面的查询并不需要在所有的连接语法,只需步行树“根据需要,例如:

var subCategoriesTag = (
    from subCatTag in motoToolsDataContext 
    from tagQuestion in subCatTag.TagQuestions 
    from question in tagQuestion 
    where subCatTag.SubCategoriesID == subcategoryId 
    orderby subCatTag.ID descending 
    select question 
); 

注意,“从”语句使用的对象从以前的一个,第二和第三,因为LINQ到SQL应该已经知道了关系。

不知道更多关于你的关系是很难给出一个比较确切的答案。我不得不对某些相关属性做出一些假设。

+0

这引出另一个问题,如果我有一个分配给我的数据库中的表已经关系(主键,外键),我注意到了DBML生成的类为我预留一段创建一个关联属性的关系,而不是全部。那么你是否在说,如果这种关系关系是正确的,那么我可以返回父母类型并且走孩子?这就是我想要的!我将不得不调查我似乎有的dbml关联错误。 – mytwocents 2009-09-16 22:00:11

+0

所以事实证明,使用dbml生成关系属性的关系问题不是因为我忘记了关系的外键部分,而是因为我缺少父表上的主键标识。现在我可以遍历问题对象的子对象,而不必担心自定义返回类型包含所需的所有数据。凉。 – mytwocents 2009-09-17 20:05:47

+0

@mytwocents:很高兴听到这个消息,一旦这一切都建立正确LINQ到SQL是相当不错的,它仍然有一些领域是有点痛苦的,但它终于得到了VS2010一些改进。 – 2009-09-17 20:36:48

0

听起来好像你正在寻找的是DataLoadOptions.LoadWith <>。这样你返回你的Question对象,并通过定义的关联同时填充相关的对象。事情是这样的:

public IQueryable<Consumer_Question> GetQuestions(int subCategoryId) 
{ 
    //create DataContext 
    using (MototoolsDataContext mototoolsDataContext = new MototoolsDataContext()) 
    { 
     mototoolsDataContext.Log = Console.Out; 
     DataLoadOptions options = new DataLoadOptions(); 
     options.LoadWith<Consumer_Questions>(q => q.Consumer_TagQuestions); 
     options.LoadWith<Consumer_TagQuestions>(tag => tag.Consumer_SubCategoriesTags); 
     mototoolsDataContext.LoadOptions = options; 

     var questions = (from subCatTag in mototoolsDataContext.Consumer_SubCategoriesTags 
           join tagQuestion in mototoolsDataContext.Consumer_TagQuestions on subCatTag.TagID equals tagQuestion.TagID 
           join question in mototoolsDataContext.Consumer_Questions on tagQuestion.QuestionsID equals question.ID 
           where subCatTag.SubCategoriesID == subCategoryId 
           orderby subCatTag.ID descending 
           select question); 
           //select new { question, tagQuestion }); 

     return questions; 
    } 
} 
+0

是的,这也可以工作,但不是“LoadWith”通常用于非延期加载? – mytwocents 2009-09-17 20:01:11

+0

正确。它会一起检索所有的值。 – 2009-09-17 22:18:44