ef4 linq نوع الإرجاع قائمة عامة
-
26-09-2019 - |
سؤال
لديّ A C#-4 MVC3 RC Application الذي يستخدم إطار الكيان 4.
لدي هذه الطريقة:
public static List<Content> FetchMenu(int websiteID) {
return (from w in ContextHelper.Current.Websites
where w.WebsiteID == websiteID
select w.Contents).ToList();
}
الكائنات المعنية هنا (المحتوى والموقع) من النوع EntityObject.
تعطي الوظيفة أعلاه خطأ في التجميع:
Cannot implicitly convert type 'System.Linq.IQueryable<System.Collections.Generic.List<Manager.Models.Content>>' to 'System.Collections.Generic.List<Manager.Models.Content>'. An explicit conversion exists (are you missing a cast?)
W.Contents هو EntityCollection<Content>
اكتب جمع.
كيف يمكنني تأجيل نوع linq.iqueryable لإرجاع قائمة عامة من محتوى النوع؟
المحلول
تحتاج إلى استخدام الأقواس ، بحيث تقدم ToList()
إلى الاستعلام بأكمله (كائن من النوع IQueryable
):
public static List<Content> FetchMenu(int websiteID) {
return (from w in ContextHelper.Current.Websites
where w.WebsiteID == websiteID
select w.Contents).ToList();
}
وإلا فأنت تتصل ToList()
تشغيل w.Contents
فقط و select
يتم تطبيقه بعد ذلك. قد يكون أكثر وضوحًا إذا أظهرت بناء جملة السلاسل.
الإصدار الخاص بك:
ContextHelper.
Current.
Websites.
Where(w => w.WebsiteID == websiteID).
Select(w => w.Contents.ToList());
الإصدار الصحيح:
ContextHelper.
Current.
Websites.
Where(w => w.WebsiteID == websiteID).
Select(w => w.Contents).
ToList();
تعديل:
حيث w.Contents
هي مجموعة ، تحتاج إلى تسويتها باستخدام SelectMany
:
public static List<Content> FetchMenu(int websiteID) {
return ContextHelper.
Current.
Websites.
Where(w => w.WebsiteID == websiteID).
SelectMany(w => w.Contents).
ToList();
}
نصائح أخرى
var query = (from w in ContextHelper.Current.Websites
where w.WebsiteID == websiteID
select w.Contents).First();
return query.ToList();
يبدو أن.
إجابة Yakimych استخدام SelectMany()
هو كوريت. من أجل الاكتمال ، هنا يستخدم بناء جملة "Query Command":
public static List<Content> FetchMenu(int websiteID) {
return (from w in ContextHelper.Current.Websites
where w.WebsiteID == websiteID
from c in w.Contents
select c).ToList();
}