سؤال

لدي استعلام linq يتضمن الكيانات الثلاثة التالية:

public class LandPoint
{
    ...
    public OlsonTimeZone TimeZone { get; set; }
}

public class OlsonTimeZone : TimeZone
{
    ...
    public virtual ICollection<WindowsTimeZone> Windows { get; set; }
}

public class WindowsTimeZone : TimeZone
{
    ...
    public virtual ICollection<OlsonTimeZone> Olson { get; set; }
}

لذا فإن LandPoint يحتوي على OlsonTimeZone الذي لا يحتوي على WindowsTimeZones أو أكثر.

ما أحاول القيام به هو الحصول على اسم WindowsTimeZone (يسبقه "Windows:") إذا كان OlsonTimeZone يحتوي على أي WindowsTimeZones أو اسم OlsonTimeZone (يسبقه "Olson:") كتراجع مع معلومات حول النقطة نفسها.

ما كتبته هو:

 return db.LandPoints.Where(x => x.GeoNameID == ID).Take(1).Select(x => new LandPoint
        {
            TimeZone = x.TimeZone
                            .Windows.Select(t => "Windows:" + x.Name)
                            .Union(new[] { "Olson:" + x.TimeZone.Name })
                            .FirstOrDefault()
        }).First();

والتي ينبغي من الناحية النظرية أن تفعل ما أريد.باستثناء أنه بالنسبة لنقطة معينة قمت باختبارها (والتي أعرف أنها مرتبطة بـ WindowsTimeZone) فقد أعادت OlsonTimeZone بدلاً من WindowsTimeZone.إذا لنفس المعرف أكتب ما يلي:

return db.LandPoints.Where(x => x.GeoNameID == ID).Take(1).Select(x => new LandPoint
        {
            TimeZone = x.TimeZone
                            .Windows.Select(t => "Windows:" + x.Name)
                            .FirstOrDefault()
        }).First();

أحصل على WindowsTimeZone.

أنا متأكد من أنه يمكنني إعادة كتابتها باستخدام عبارة CASE ولكني شعرت أن هذا كان أكثر أناقة.نظرًا لأن الطريقة التي يتصرف بها غير بديهية إلى حد ما، وفهم سبب قيامه بما يفعله سيساعدني في الحصول على شعور أفضل بكيفية ترجمة استعلامات linq إلى SQL، فقد قررت نشر سؤال هنا.

فلماذا يفعل ما يفعله؟هل هناك بعض الإضافات إلى الكود أعلاه والتي من شأنها أن تجعله يعمل (الحفاظ على بيان UNION)؟

شكرا مقدما جون

هل كانت مفيدة؟

المحلول

فذلك لأن الاتحاد لا يضمن الطلب.لا يمكنك وضع أي توقعات خاصة بناءً على ترتيب العناصر دون طلبها.ولكن يجب أن يتم إطلاق الكود الخاص بك NotSupportedException لأن هذا لا يجوز: db.LandPoints.Select(x => new LandPoint ...

اذا كنت تمتلك LandPoint الكيان المعين بواسطة إطار عمل الكيان لا يمكنك عرضه على هذا النوع في Linq-to-entities.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top