Linq إلى SQL: .FirstOrDefault () غير قابل للتطبيق لتحديد جديد {...}

لقد طلبت للتو هذا السؤال . التي تقودني إلى سؤال جديد :)

حتى هذه النقطة ، لقد استخدمت النمط التالي من اختيار الأشياء مع Linq إلى SQL ، بغرض أن تكون قادراً على التعامل مع 0 "صفوف" تم إرجاعها بواسطة الاستعلام:

var person = (from p in [DataContextObject].Persons
              where p.PersonsID == 1
              select new p).FirstOrDefault();

if (person == null)
{
   //handle 0 "rows" returned.
}

ولكن لا يمكنني استخدام FirstOrDefault() عندما أفعل:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode };

// Under the hood, this pattern generates a query which selects specific
// columns which will be faster than selecting all columns as the above
// snippet of code does. This results in a performance-boost on large tables.

How do I check for 0 "rows" returned by the query, using the second pattern?



UPDATE:

أعتقد أن عملية الإنشاء الخاصة بي فشلت لأنني أحاول تعيين نتيجة الاستعلام للمتغير ( this._user ) المعلن بنوع [DataContext]. المستخدم .

this._user = (from u in [DataContextObject].Users
              where u.UsersID == [Int32]
              select new { u.UsersID }).FirstOrDefault();

خطأ في التصنيف: لا يمكن ضمنيًا تحويل النوع "AnonymousType # 1" إلى "[DataContext] .User".

أي أفكار حول كيف يمكنني الحصول على هذا حولها؟ هل عليّ أن أجعل موضوعي الخاص؟

4

5 إجابة

لماذا يمكنك الاستمرار في فعل التسنين؟ هل يعطيك خطأ؟

var person = (from p in [DataContextObject].Persons
              where p.PersonsID == 1
              select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode }).FirstOrDefault();

if (person == null) {    
   //handle 0 "rows" returned.
}

ما زال كائنًا مرجعًا مثل كائن فعلي ، فهو مجهولة تمامًا لذا لا تعرف النوع الفعلي قبل تجميع الشفرة.

13
وأضاف
تحديث سؤالي.
وأضاف المؤلف roosteronacid, مصدر
متفق عليه ، يجب أن تعمل أعلاه ، ما لم يكن هناك خطأ وقت التشغيل غير ذي صلة.
وأضاف المؤلف Codewerks, مصدر

<�القوي> تحديث: </قوي>

أرى الآن ما كنت في الواقع تسأل! آسف ، لم تعد إجابتي تنطبق. ظننت أنك لم تحصل على قيمة فارغة عندما كانت فارغة. الاستجابة المقبولة صحيحة ، إذا كنت تريد استخدام الكائن خارج النطاق ، فستحتاج إلى إنشاء نوع جديد واستخدام Just MyType (...) فقط. وأنا أعلم أن RefactorPro من DevEx لديه إعادة بناء على ذلك ، وأعتقد أن resharper يفعل كذلك.

استدعاء .FirstOrDefault (فارغة) مثل هذا:

string[] names = { "jim", "jane", "joe", "john", "jeremy", "jebus" };
var person = (
    from p in names where p.StartsWith("notpresent") select 
        new { Name=p, FirstLetter=p.Substring(0,1) } 
    )
    .DefaultIfEmpty(null)
    .FirstOrDefault();

MessageBox.Show(person==null?"person was null":person.Name + "/" + person.FirstLetter);

هذا لا حيلة بالنسبة لي.

2
وأضاف
if (person.Any()) /* ... */;

أو

if (person.Count() == 0) /* ... */;
1
وأضاف

بالنسبة إلى UPDATE: يجب عليك إما إنشاء نوع خاص بك ، أو تغيير هذا ._user ليكون int ، أو تحديد الكائن بأكمله ، وليس فقط أعمدة محددة.

1
وأضاف

لا يزال بإمكانك استخدام FirstOrDefault . لدينا فقط

var PersonFields = (...).FirstOrDefault()  

سوف تكون PersonFields فارغة أو كائن مع تلك الخصائص التي قمت بإنشائها.

0
وأضاف