PDA

View Full Version : سوال: افزودن ستون جدید زمان واکشی اطلاعات با Entity Framework



mousa1992
شنبه 26 مرداد 1392, 23:13 عصر
سلام
وقتتون بخیر

دوستان ممنون میشم راهنمایی کنید
من اطلاعاتی رو واکشی میکنم از بانک و میخوام ستونی جدید رو اضافه کنم و مقادیری رو توش بریزم و دو مشکل وجود داره
1 - زمانی که کوئری مینویسی با استفاده از entity framework نمیشه از توابع استفاده کرد برا مقدار دهی به اون فیلد
2 - اومدم زمان نوشتن شرط ها ی ستون جدید تعریف کردم از نوعی که میخوام ک بعد از واکشی یکی یکی رکوردها رو بررسی و به فیلد مورد نظرم مقدار بدم که در این حالت بهم میگه که این فیلده read only هست و نمیشه تغییرش داد

خب راه حلی دارید شما ؟

ممنون از توجهتون

Mahmoud.Afrad
یک شنبه 27 مرداد 1392, 02:09 صبح
همونی که خودت به دیگران پیشنهاد میدی اینجا به کمکت میاد ، توابع توسعه.

mousa1992
یک شنبه 27 مرداد 1392, 02:20 صبح
همونی که خودت به دیگران پیشنهاد میدی اینجا به کمکت میاد ، توابع توسعه. آقا دمت گرم انتقاد بود ؟:بامزه:
خب همونطور که خودم برا پیدا کردن مشکلم روش فکر میکنم و سرچ میکنم و در مرحله اخر تاپیک میزنم از بقیه هم همین انتظارو دارم و قانونشم همینه :لبخندساده: اما این یکی اصلا نفهمیدم کجا دنبالش بگردم هرچند زیاد سرچ کردم ( این روزا بسکه با موضوعات جدید مواجه میشم خستم کرده )
خب ایده ای به ذهنم نرسید متاسفانه - ممکنه بیشتر راهنمایی کنی

Mahmoud.Afrad
یک شنبه 27 مرداد 1392, 02:40 صبح
متدی که خطا ایجاد کنه بزاری بهتره.

mousa1992
یک شنبه 27 مرداد 1392, 03:17 صبح
#region Return Works
public IEnumerable<Work> ReturnWorks(string _Date)
{
IEnumerable<Work> result = db.WorkDones.Where(work => work.Date == _Date).Select(work => new Work { ID = work.ID, Title = work.WorkDoneTitle, StartTime = work.StartTime, EndTime = work.EndTime });

List<Work> list = new List<Work>();

foreach (var item in result)
{
try
{
item.Duration = new TimeSpan(Int32.Parse(item.EndTime.Substring(0, item.EndTime.IndexOf(':')).Trim()), Int32.Parse(item.EndTime.Substring(item.EndTime.In dexOf(':') + 1, 2).Trim()), 0).Subtract(new TimeSpan(Int32.Parse(item.StartTime.Substring(0, item.StartTime.IndexOf(':')).Trim()), Int32.Parse(item.StartTime.Substring(item.StartTim e.IndexOf(':') + 1, 2).Trim()), 0)).ToString();
}
catch { }
list.Add(item);
}

return list;
}
#endregion

}

public class Work
{
public int ID { get; set; }
public string Title { get; set; }
public string StartTime { get; set; }
public string EndTime { get; set; }
public string Duration { get; set; }
}


نهایتا با تعریف کلاسی جدید این کارو انجام دادم که در واقع میخواستم Duration رو اضافه کنم

از این مطلب (http://msdn.microsoft.com/en-us/library/bb384087.aspx)کمک گرفتم

موفق باشید

Mahmoud.Afrad
یک شنبه 27 مرداد 1392, 20:06 عصر
فکر کنم Duration اگر اختلاف endtime و starttime هست اشتباه حساب کردی اختلاف ساعت و ثانیه رو حساب نکردی. میتونی از متد Parse استفاده کنی و اختلاف رو حساب کنی.


به صورت متد توسعه هم میتونی
کلاس work و قسمت select new work را ببری داخل یک کلاس مجزا :

internal static class MyExtensionMethods
{
public class Work : WorkDone
{
public int ID { get; set; }
public string Title { get; set; }
public string StartTime { get; set; }
public string EndTime { get; set; }
public string Duration { get; set; }
}

public static IEnumerable<Work> LoadWorks(this IEnumerable<WorkDone> source)
{
return
(from s in source
select new Work()
{
ID = s.ID,
Title = s.WorkDoneTitle,
StartTime = s.StartTime,
EndTime = s.EndTime,
Duration = TimeSpan.Parse(s.EndTime) - TimeSpan.Parse(s.StartTime)
}).ToList();
}
}

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

public IEnumerable<Work> ReturnWorks(string _Date)
{
IEnumerable<Work> result = db.WorkDones.Where(work => work.Date == _Date).LoadWorks();
return result;
}

mousa1992
دوشنبه 28 مرداد 1392, 00:20 صبح
مرسی محمود جان بابت کد اماده که بهم دادی تنبل میشما :بامزه:
در مورد بدست اوردن اختلاف زمانی تبدیلشون کردم به timeSpam وبعد اختلافو بدست اوردم درست جواب میده کدشو همش تو ی خط نوشتم یکم گیج کننده شده اخه پروژه کوچیک بود رو اصول کار کردن وقت گیر تر میشه

بازم ممنون از توجه و کمکت

mousa1992
دوشنبه 28 مرداد 1392, 01:38 صبح
البته محمود جان

new TimeSpan(Int32.Parse(item.EndTime.Substring(0, item.EndTime.IndexOf(':')).Trim()), Int32.Parse(item.EndTime.Substring(item.EndTime.In dexOf(':') + 1, 2).Trim()), 0)


البته نمیدونستم که timeSpan متدی به نام parse داره ها ( اعتراف ) ولی خب بعد از اینکه کدتون رو دیدم تست کردم دیدم این فرمت زمانی رو نمیشناسه
خب ی نقص هایی رو الان متوجه شدم که باید اصلاح بشه ( در صورتی که PM به AM و یا ب عکس تغییر داشته باشه محاسبه اشتباه میشه )

رشته ای که از دیتابیس میگیرم به این صورت هست 10:08 PM و یا 8:10 AM
خب من اومدم از 0 تا محل ':' رو گرفتم برا ساعت و از ( ':' +1 ) تا 2 خونه بعدشو گرفتم برا دقیقه و ثانیه هم که صفر دادم چون مهم نیست و ساعت پایان و شروع رو به همین ترتیب تبدیل کردم به timespan و از متد subtract استفاده کردم برا بدست اورن اختلافشون

بازم ممنون که باعث شدین متوجه اشتباه بشم خب با این وضعیت چک میکنم اگه PM بود 12 ساعت میذارم روش و به روز هم که کاری ندارم

Mahmoud.Afrad
دوشنبه 28 مرداد 1392, 02:20 صبح
متد Parse از کلاس DateTime این فرمت رو قبول میکنه.

string t1 = "8:10 AM";
string t2 = "10:08 PM";

DateTime dt1 = DateTime.Parse(t1);
DateTime dt2 = DateTime.Parse(t2);

TimeSpan ts = dt2.Subtract(dt1);

MessageBox.Show(ts.ToString());