c# - الاستعلام عن DataColumnCollection مع LINQ




datatable asqueryable (4)

كيف حول:

var x = from c in dt.Columns.Cast<DataColumn>()
        select c.ColumnName;

أحاول إجراء استعلام LINQ بسيط على الخاصية Columns من DataTable:

from c in myDataTable.Columns.AsQueryable()
    select c.ColumnName

ومع ذلك ، ما أحصل عليه هو:

تعذر العثور على تطبيق لنمط الاستعلام لنوع المصدر 'System.Linq.IQueryable'. "اختيار" غير موجود. فكر بوضوح في تحديد نوع متغير النطاق "c".

كيف يمكنني الحصول على DataColumnCollection للعب بشكل لطيف مع LINQ؟


مع Linq Method Syntax:

var x = myDataTable.Columns.Cast<DataColumn>().Select(c => c.ColumnName);

يمكنك أيضًا استخدام:

var x = from DataColumn c in myDataTable.Columns
        select c.ColumnName

سيؤدي فعلاً نفس الشيء مثل رمز Dave: "في تعبير استعلام ، يترجم متغير تكرار مطبوع بشكل واضح إلى استدعاء Cast (IEnumerable)" ، وفقًا Enumerable.Cast<TResult> Method MSDN Enumerable.Cast<TResult> Method .


جرب هذا :

var results= persons.GroupBy(n => n.PersonId)
            .Select(g => new {
                           PersonId=g.Key,
                           Cars=g.Select(p=>p.car).ToList())}).ToList();

ولكن من ناحية الأداء ، فإن الممارسة التالية أفضل وأكثر ملاءمة في استخدام الذاكرة (عندما تحتوي صفيفتنا على عناصر أكثر بكثير مثل الملايين):

var carDic=new Dictionary<int,List<string>>();
for(int i=0;i<persons.length;i++)
{
   var person=persons[i];
   if(carDic.ContainsKey(person.PersonId))
   {
        carDic[person.PersonId].Add(person.car);
   }
   else
   {
        carDic[person.PersonId]=new List<string>(){person.car};
   }
}
//returns the list of cars for PersonId 1
var carList=carDic[1];






c# linq datatable asqueryable datacolumncollection