LINQ إلى SQL: الجدول متعددة الانضمام نوع الإرجاع لا تولدها DBML
-
07-07-2019 - |
سؤال
وأنا أحاول معرفة أفضل طريقة للتعامل مع مشكلة بسيطة: لدي LINQ بسيط الانضمام إلى جدولين. أنا أعرف كيف للعودة نوع للطاولة واحدة، لأنه هو نفس الطبقة DBML إنشاؤه. ومع ذلك، ما إذا كنت تريد إرجاع البيانات من كلا tables- ليس هناك طريقة للعودة على حد سواء واستخدام علاقاتهم؟ هل حقا لديك لإنشاء نوع آخر عودة لإرجاع البيانات من كلا الجدولين؟ FYI- أنا لا أريد لإرجاع معلمة الإخراج مع الكائن الجدول الآخر. أنا أيضا لا نرغب حقا في العودة نوع مجهول. ما هو توصية أفضل الممارسات؟
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;
}
وشكرا على اي مساعدة،
المحلول
إذا كنت قد حددت علاقاتك في المصمم 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
);
لاحظ أن 2 و 3 'من' البيانات تستخدم الكائن من سابقتها، منذ LINQ إلى SQL يجب أن نعرف عن هذه العلاقة.
ودون أن يعرفوا المزيد عن علاقاتك أنه من الصعب إعطاء إجابة أكثر دقة. كان لزاما على بعض الافتراضات حول ما هي الخصائص ذات الصلة.
نصائح أخرى
ويبدو لي ان ما كنت تبحث عن DataLoadOptions.LoadWith <>. وبهذه الطريقة يمكنك العودة كائن سؤال ويتم ملؤها الكائنات ذات الصلة في نفس الوقت من خلال الجمعيات محددة. شيء من هذا القبيل:
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;
}
}