سؤال

وعندي استفسار LINQ والتي ترجع معرف سؤال استنادا إلى نص الأسئلة. ثم هناك حاجة إلى هذا الرقم لاستخدامها لربط تاريخ في الجدول التاريخ على هذا السؤال بالذات. وبالفعل تخزين السؤال ويتم تخزين التاريخ في وقت آخر.

والمشكلة هي أن الاستعلام بإرجاع questionID كنوع مجهول وذلك عندما كنت في حاجة إلى تعيين هذا questionID كما questionID في جدول آخر، فإنه يلقي خطأ، مشيرا إلى أن الجدول يتوقعون الدليل. وفي أعقاب ذلك، I تحويل نوع مجهول إلى سلسلة ثم استخدام المعرفات الفريدة العمومية ميزة تحويل لتحويل السلسلة إلى GUID، ومع ذلك تم إعطائي الآن الخطأ أن GUID يجب أن يكون 32 حرفا و 4 شرطات.

وأفكاري حول هذا هي أن نوع مجهول تعود للquestionID باسم "QuestionID = jkj939-89239829- الخ الخ." - مع البادئة من الشخصيات في الجبهة، وبالتالي عندما تحويله إلى GUID، سلسلة تحويلها تحتوي هذه الشخصيات

وقد فاتني شيء؟ أنا حقا لا أستطيع أن أفهم لماذا أنها ستفعل ذلك، وليس هناك وسيلة لإزالة البادئة التي تم إرجاعها بواسطة نوع مجهول؟ سوف مساعدة سيكون موضع تقدير كبير.

وهنا هو رمز:

public static void GetQuesID(string quesText)
    {
        ExamineDataContext dc = new ExamineDataContext();
        var matchedques = from q in dc.GetTable<Question>()
                            where q.QuestionText.Contains(quesText)
                            select new{
                                q.QuestionID
                            };
        foreach (var element in matchedques)
        {
            MessageBox.Show(element.ToString());
        }

        try
        {
            Guid g = Guid.NewGuid();
            Table<DateLastUsed> dlused = Repository.GetDateLastUsedTable();
            DateLastUsed dlu = new DateLastUsed(); ;
            string qidGuidString = matchedques.ToString();
            Guid convQuesGuid = new Guid(qidGuidString);
            dlu.DLUID = g;
            dlu.QuestionID = convQuesGuid;
            dlu.DateLastUsed1 = DateTime.Now;

            dlused.InsertOnSubmit(dlu);
            dlused.Context.SubmitChanges();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
هل كانت مفيدة؟

المحلول

وإذا لم أنا في عداد المفقودين شيء، لماذا لا تقوم فقط select q.QuestionID بدلا من جعل من نوع مجهول المجمع الجديد؟

var matchedques = from q in dc.GetTable<Question>()
                            where q.QuestionText.Contains(quesText)
                            select q.QuestionID;

foreach (var element in matchedques)
{
    MessageBox.Show(element.ToString());
}

وبدلا من ذلك، وإعطاء مجال اسم ( "theID" أدناه)، والوصول إليه مباشرة:

var matchedques = from q in dc.GetTable<Question>()
                            where q.QuestionText.Contains(quesText)
                            select new{
                                theID = q.QuestionID
                            };

foreach (var element in matchedques)
{
    MessageBox.Show(element.theID.ToString());
}

وعلى ما يبدو، كان هناك أكثر على السؤال من اعتقدت في البداية. وردا على تعليق، نضع في اعتبارنا أن كنت إرجاع <م> تعداد النتائج في matchedques (ومن هنا جاء foreach أعلاه، أليس كذلك؟). حتى السطر التالي هو أيضا في الخطأ:

string qidGuidString = matchedques.ToString();

وأنت إما تريد

string qidGuidString = matchedques.Single().ToString();

وإذا matchedques يجب أن يحتوي على نتيجة واحدة، أو حلقة foreach إذا matchedques يجب أن يحتوي على عدة نتائج.


ملاحظة أنه لا يوجد سبب لتحويل GUID إلى سلسلة والعودة مرة أخرى، ويمكنك أيضا استخدام الاستعلام للعودة شيء أكثر فائدة (أي كائن DateLastUsed جديد):

var matchedques = from q in dc.GetTable<Question>()
                            where q.QuestionText.Contains(quesText)
                            select new DateLastUsed() {
                                DLUID = Guid.NewGuid(),
                                QuestionID = q.QuestionID,
                                DateLastUsed1 = DateTime.Now
                            };

Table<DateLastUsed> dlused = Repository.GetDateLastUsedTable();

foreach(var dlu in matchedques)
{
    dlused.InsertOnSubmit(dlu);
    dlused.Context.SubmitChanges();
}

نصائح أخرى

لماذا لا مجرد select q.QuestionID; بدلا من هذا `حدد جديد {q.QuestionID}؛ ' الاشياء؟

وأنت تدعو .ToString () على matchedques، وهو التعداد:

var matchedques = from q in dc.GetTable<Question>()
                            where q.QuestionText.Contains(quesText)
                            select new{
                                q.QuestionID
                            };

string qidGuidString = matchedques.ToString();

وهكذا في المثال الخاص بك أعلاه، matchedques هو enunmeration من أنواع المجهولة (ربما يجب عليك التخلص من ذلك وتحديد q.QuestionID مباشرة). وسوف تدعو ToString () على هذا إرجاع تمثيل سلسلة من الكائن، وليس مجرد QuestionId من العنصر الأول من التسلسل.

هل تتوقع أن يكون هناك دائما نتيجة واحدة فقط للاستعلام أعلاه؟ إذا كان الأمر كذلك، ربما يجب عليك أن ننظر في مشغل واحد.

وشيء من هذا القبيل ينبغي القيام به:

var matchedQuesId = 
    dc.GetTable<Question>()
    .Where(q =>q.QuestionText.Contains(quesText))
    .Single()
    .QuestionID;

في هذه الحالة، يمكنك بعد ذلك استخدام matchedQuesId مباشرة. لاحظ أنه إذا كان الاستعلام أين مباريات لا شيء، أو عناصر أكثر من واحد، وهذا سوف رمي خطأ. تقرأ على مشغل واحد لمعرفة السبب.

وجرب هذا:

var matchedques = (from q in dc.GetTable<Question>()
                  where q.QuestionText.Contains(quesText)
                  select new{
                      q.QuestionID
                  }).FirstOrDefault();

وبعد ذلك ببساطة:

if (matchedques != null){
    // Just use matchedques.QuestionID to get your value
}

وFirstOrDefault سيحدد matchedques فار إلى مثيل واحد من وجوه، وليس ennumeration منهم. يعمل على علاج عندما تعلم أن هناك قيمة واحدة فقط لأنك تريد. يعني بت OrDefault سيتم NULL إذا وجدت شيئا.

تغيير إلى:

...
var matchedques = from q in dc.GetTable<Question>()
                        where q.QuestionText.Contains(quesText)
                        select q.QuestionID;

ومنها مثلا. إزالة الجديد {...}، لذلك كنت تقوم بإنشاء نوع anonimouse جديد مع الخاصية الهوية.

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