PDA

View Full Version : Method 'System.DateTime Con(System.String)' has no supported translation to SQL.



YourWorldToday
شنبه 28 فروردین 1389, 18:58 عصر
با سلام خدمت دوستان گرامی
فیلد تاریخ در بانکم از نوع nvarchar هستش و تاریخ شمسی رو ذخیره می کنه
حالا در زمان برگشت اطلاعات نیاز دارم که تاریخ شمسی رو به تاریخ میلادی برای استفاده از دو تاریخ تبدیل کنم تا بتونم در یک بازه زمانی جستجو انجام بدم.
این کدی هستش که استفاده کردم



var Result = from _projects in db.Projects
join _itemstatus in db.ItemStatus on _projects.ItemStatusID equals _itemstatus.ItemStatusID
whereGenralClasses.FarsiDate.Con(_projects.OrderDa te) >= GenralClasses.FarsiDate.Con(FirstDate) &&
GenralClasses.FarsiDate.Con(_projects.OrderDate) <= GenralClasses.FarsiDate.Con(EndDate)
selectnewAllData { itemstatus = _itemstatus, project = _projects };




تابع con دقیقا تاریخ رو به میلادی تبدیل می کنه ولی نمی دونم چرا زمان اجرا خطای زیر رو میده.

Method 'System.DateTime Con(System.String)' has no supported translation to SQL.

این هم کد تابع تاریخ



DateTime DT;
DT = System.Convert.ToDateTime(Farhani.PersianDate.Conv ert.ToGregorian(Date));

Mostafa_Dindar
یک شنبه 29 فروردین 1389, 17:03 عصر
سلام ،

من هم چند روز پيش همچين سوالي (http://barnamenevis.org/forum/showthread.php?t=214955) نوشتم كه هنوز كسي جواب نداده .

من مشكلم رو تونستم حل كنم ولي من به روش شما كار نميكنم .

من هميشه تاريخ رو در ديتابيس از نوع DataTime ميگيريم و هنگام نمايش در UI اون رو به فارسي تبديل كرده و به صورت رشته نمايش ميدم . هنگام درج هم به صورت English درج ميكنم .

قبل از linq من به صورت زير عمل ميكردم :

private DateTime _insertDate;
/// I have "InertDate" field in my Table on Database
public DateTime InsertDate
{
get { return _insertDate; }
set { _insertDate = value; }
}

// Because i need to do some processing I create a readonly string property that pass InsertDate to Utility method and return special string Date
public string PInsertDate
{
get { return Utility.ToSpecialDate(_insertDate); }
}


در Linq به صورت زير نوشتم كه مثل شما خطا ميداد :

ToosDataContext db = new ToosDataContext();
var newslist = from p in db.News
select new {p.NewsId,p.Title,tarikh =MD.Utility.ToSpecialDate( p.ReleaseDate)};

GridView1.DataSource = newslist;
GridView1.DataBind();


و در نهايت اينطور نوشتم كه جواب داد :


var newslist = db.News
// First do a select in SQL
.Select(p => new {p.NewsId, p.Title, p.ReleaseDate})
.AsEnumerable() // Do the rest in process
.Select(p => new {p.NewsId, p.Title,
tarikh = MD.Utility.ToSpecialDate(p.ReleaseDate) });


موفق باشي

Mostafa_Dindar
یک شنبه 29 فروردین 1389, 17:10 عصر
اگر يكي از دوستان با تجربه بيان و به ما بگن كه براي DateTime چه كاري بهتر هست ، ممنون ميشم .

در ديتابيس از چه فيلدي استفاده ميكنند ؟ كجا عمل تغير رو انجام ميدهند ؟ و .....

من در قبل در Business Object هام به ازاي هر Propertyاز نوع DateTime يك Property رشته اي ديگه كه با حرف P شروع ميشد ايجاد ميكردم و از تابع Utility و Static اي كه داشتم براي تبديل استفاده ميكردم .

ولي در Linq هنوز به يك راه حل مشخص نرسيدم ..

همچنين ميتوينم در رويداد RowDatabound از گريد وي ( البته اگر از گريد ويو استفاده كنيم ) يا رويدادهاي bound ديگر كنترل هاي داده براي تبديل نوع تاريخ ميلادي به فارسي هم استفاده كنيم كه زياد انعطاف پذير نيست .

لطفا با تجربه ها بيان و راهنمايي كنند .