سؤال

أنا أستخدم LINQ للاستعلام عن قاموس عام ثم استخدم النتيجة كمصدر بيانات لـ ListView (WebForms).

كود مبسط:

Dictionary<Guid, Record> dict = GetAllRecords();
myListView.DataSource = dict.Values.Where(rec => rec.Name == "foo");
myListView.DataBind();

اعتقدت أن هذا سيعمل ولكن في الواقع فإنه يلقي System.InvalidOperationException:

يجب أن تحتوي ListView مع المعرف "MyListView" على مصدر بيانات يقوم إما بتنفيذ iCollection أو يمكنه إجراء ترحيل مصدر البيانات إذا كان ALTERPAGING صحيحًا.

ولكي أتمكن من العمل كان علي أن ألجأ إلى ما يلي:

Dictionary<Guid, Record> dict = GetAllRecords();
List<Record> searchResults = new List<Record>();

var matches = dict.Values.Where(rec => rec.Name == "foo");
foreach (Record rec in matches)
    searchResults.Add(rec);

myListView.DataSource = searchResults;
myListView.DataBind();

هل هناك مسكتك الصغيرة في المثال الأول لإنجاحه؟

(لم أكن متأكدًا مما سأستخدمه كعنوان سؤال لهذا السؤال، فلا تتردد في تعديله إلى عنوان أكثر ملاءمة)

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

المحلول

جرب هذا:

var matches = dict.Values.Where(rec => rec.Name == "foo").ToList();

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

نصائح أخرى

أميل إلى تفضيل استخدام بناء جملة Linq الجديد:

myListView.DataSource = (
    from rec in GetAllRecords().Values
    where rec.Name == "foo"
    select rec ).ToList();
myListView.DataBind();

لماذا تحصل على قاموس عندما لا تستخدم المفتاح؟أنت تدفع ثمن تلك النفقات العامة.

يمكنك أيضًا تجربة ما يلي:

var matches = new List<Record>(dict.Values.Where(rec => rec.Name == "foo"));

من الصعب جدًا إنشاء المجموعات العامة بشكل مباشر، لذلك ليس لديك خيار سوى إنشاء كائن جديد.

myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo");

مجرد إضافة المعرفة إلى الجملة التالية لا يستعيد أي بيانات من de db.ما عليك سوى إنشاء الاستعلام (لأنه نوع قابل للاستعلام).لبدء تشغيل هذا الاستعلام، يجب عليك إضافة .ToList() أو .First() في النهاية.

dict.Values.Where(rec => rec.Name == "foo")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top