PDA

View Full Version : اشکال در Linq



gharibeh223
شنبه 16 مهر 1390, 14:51 عصر
سلام .

برای به روز رسانی جدول (Update ) از کد زیر استفاده می کنم .
تغییر ات انجام شده در enN05 ذخیره شده است و وقتی به queryN05 نسبت داده می شه و بعد دیتا سابمیت می شه داده ها در جدول نمی شینه
حتما باید فیلد ها تک تک مقدار داده بشه . مثل : queryN05.fDate = enN05.fDate; راه حل چیه ؟





public bool SaveData( N05 enN05)
{

var queryN05 = (from t in bank.N05s
where t.WellCode == '1'
select t).SingleOrDefault();

queryN05 = enN05;
bank.SubmitChanges();
}






از راهنمایتون ممنون .

sanay_esh
شنبه 16 مهر 1390, 15:01 عصر
در صورتی که نوعها با هم یکی نباشند این اتفاق نمی افته

در صورتی که enN05 شما با aueryN05 از نظر ترتیب فیلدها یکی نباشد احتمال بروز خطا وجود دارد!!

بهترین حالت برای استفاده از این روش Entity Framework هست که خیلی کارت رو راحت میکنه سعی کن از روش جدیدتر استفاده کنی

gharibeh223
یک شنبه 17 مهر 1390, 11:19 صبح
همه چیز دقیقا نظیر به نظیر یکسانه .
به این نتیجه رسیدم که رویداد PropertyChanging در enN05 مقدار null داره .
حالا چطور می تونم رویداد queryN05.PropertyChanging به enN05.PropertyChanging نسبت بدیم ؟

mehdi.mousavi
دوشنبه 18 مهر 1390, 01:28 صبح
همه چیز دقیقا نظیر به نظیر یکسانه . به این نتیجه رسیدم که رویداد PropertyChanging در enN05 مقدار null داره . حالا چطور می تونم رویداد queryN05.PropertyChanging به enN05.PropertyChanging نسبت بدیم ؟

سلام.
اون Assignment شما باعث میشه تا Object اصلی Overwrite بشه و از بین بره. در نتیجه، همونطوریکه فرمودید، باید تک تک Property ها رو خودتون جداگانه Set کنید. اما حقیقتش متوجه نمیشم که چرا شما اول Query نمی کنید، بعد نتیجه query رو (queryN05) تغییر نمی دید و در نهایت به SaveData ارسال نمی کنید؟ انجام این کار اولویت داره... در هر حال، شما می تونید از Reflection برای Assign کردن کلیه Property های Object مورد نظر، به Object مقصد استفاده کنید. کلاس زیر رو در نظر بگیرید:

public class MyClass
{
public int Prop1 { get; set; }
public double? Prop2 { get; set; }
public bool Prop3 { get; set; }
}

حالا فرض کنید یک Instance از این کلاس ایجاد کرده ایم:

MyClass source = new MyClass { Prop1 = 2, Prop2 = 20.95, Prop3 = true };

و فرض کنیم Object ای تحت نام dest داریم:

MyClass dest = new MyClass();

حالا، جای اینکه تک تک Property ها رو بخواهیم Assign کنیم، یعنی:


dest.Prop1 = source.Prop1;
dest.Prop2 = source.Prop2;
dest.Prop3 = source.Prop3;

می تونیم در یک حلقه این کارو انجام بدیم:


Type srcType = source.GetType(), destType = dest.GetType();
foreach (PropertyInfo pi in srcType.GetProperties())
destType.GetProperty(pi.Name).SetValue(dest, pi.GetValue(source, null), null);

موفق باشید.

پاورقی: System.Reflection رو به لیست Namespace ها اضافه کنید. دقت داشته باشید که این روش، نسبت به Assign کردن تک تک Property ها، کند تره، چون از Reflection برای اینکار استفاده می کنه. بازهم تاکید می کنم، اگر می تونید روشی که در فوق بهش اشاره کردم رو پیاده سازی کنید.

gharibeh223
دوشنبه 18 مهر 1390, 12:32 عصر
بسیار بسیار ممنون .
کارم راه افتاد .
فقط یه تغییر کوچیک دادم برای فیلد های که null هستند .


Type srcType = source.GetType(), destType = dest.GetType();
foreach (PropertyInfo pi in srcType.GetProperties())
if (pi.GetValue(enN01,null)!=null)
destType.GetProperty(pi.Name).SetValue(dest, pi.GetValue(source, null), null);

mehdi.mousavi
دوشنبه 18 مهر 1390, 15:07 عصر
سلام.
از همین میترسیدم که این روش رو بعنوان اولین روش انتخاب کنید :) برای همین با دو دلی کد مورد نظر رو نوشتم... سرعت اجرای این کد، بدلیل استفاده از Reflection تعریف چندانی نداره، بنظرم براحتی میتونید سناریوای که در پاسخ قبلی بهتون دادم رو دنبال کنید، بدون اینکه مجبور باشید از Reflection استفاده کنید.

موفق باشید.

gharibeh223
دوشنبه 18 مهر 1390, 16:09 عصر
از روش اول استفاده نکردم چون :
در لایه UI یه var enN05 = new Dal.N05 تعریف شده که enN05 به صورت دستی پر می شه و به لایه BLL که همون SaveData داخلش هست فرستاده می شه .
و چون enN05 رویداد PropertyChanging مقدارش null هست نمی تونم به صورت مستقیم update کنم !!

غیر از Reflection از راه دیگه ای هم می شه استفاده کرد که مشکل سرعت نداشته باشه ؟