سؤال

أرغب في تحديث عمودين من DataTable في سطر واحد باستخدام استعلام LINQ. حاليا أنا أستخدم سطرين لفعل الشيء نفسه:

oldSP.Select(string.Format("[itemGuid] = '{0}'", itemGuid)).ToList<DataRow>().ForEach(r => r["startdate"] = stDate);
oldSP.Select(string.Format("[itemGuid] = '{0}'", itemGuid)).ToList<DataRow>().ForEach(r => r["enddate"] = enDate);

كيف يمكنني القيام بذلك في سطر واحد ، باستخدام خط واحد Select?

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

المحلول

يمكنك القيام بذلك في "خط" واحد ، فقط تمرير مندوب الإجراء المناسب إلى طريقة foreach:

oldSP.Select(string.Format("[itemGuid] = '{0}'", itemGuid))
     .ToList<DataRow>()
     .ForEach(r => { 
        r["startdate"] = stDate;
        r["enddate"] = enDate;
      });

كما يمكنك استخدام LINQ إلى مجموعة البيانات (تبدو أكثر قابلية للقراءة بالنسبة لي ، من خط واحد):

var rowsToUpdate = 
    oldSP.AsEnumerable().Where(r => r.Field<string>("itemGuid") == itemGuid);

foreach(var row in rowsToUpdate)
{
    row.SetField("startdate", stDate);
    row.SetField("enddate", enDate);
}

نصائح أخرى

استخدم Bracly Bracers للقيام بعملين في المزيد من العمليات:

oldSP.Select(string.Format("[itemGuid] = '{0}'", itemGuid))
       .ToList<DataRow>()
       .ForEach(r => { r["enddate"] = enDate); r["startdate"] = stDate; });

لكن بالنسبة لقدرة الكود ، أود استخدام الطراز القديم foreach عقدة.

جرب هذا :

oldSP.Select(string.Format("[itemGuid] = '{0}'", itemGuid)).ToList<DataRow>()
     .ForEach(r => { r["startdate"] = stDate; r["enddate"] = enDate; });

لم يعجبني أي من الأمثلة التي رأيتها على الويب ، لذلك هذا مثالي

        DataTable dt = new DataTable();
        dt.Columns.Add("Year");
        dt.Columns.Add("Month");
        dt.Columns.Add("Views");
        for (int year = 2011; year < 2015; year++)
        {
            for (int month = 1; month < 13; month++)
            {
                DataRow newRow = dt.NewRow();
                newRow[0] = year;
                newRow[1] = month;
                newRow[2] = 0;
                dt.Rows.Add(newRow);
            }
        }

        dataGridView1.DataSource = dt;

        //if using Lambda 
        //var test = dt.AsEnumerable().Where(x => x.Field<string>("Year") == "2013" && x.Field<string>("Month") == "2").ToList();

        var test = (from x in dt.AsEnumerable()
                    where x.Field<string>("Year") == "2013"
                    where x.Field<string>("Month") == "2"
                    select x).ToList();


        test[0][0] = "2015";

        dt.AcceptChanges();

// إذا كانت الكتابة إلى SQL استخدم dt.submitchanges () بدلاً من ذلك

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