PDA

View Full Version : حرفه ای: مقایسه فیلد از نوع string با مقدار integer



ahmad156
یک شنبه 22 اردیبهشت 1392, 18:25 عصر
سلام دوستان
من یکی فیلد از نوع String دارم.توی یکی از query هام میخوام اون رو با مقداری Integer مقایسه کنم.مشکل من اینه که داخل Where اجازه تبدیل به من نمیده:ناراحت:

Where(x=>x.val>number)

val مقداری از نوع string و number مقداری از نوع integer. در ضمن مقادیر عدد هستند که به صورت string دخیره میشوند و مجبور هم هستم که string ذخیره میکنم:لبخند:

ahmad156
دوشنبه 23 اردیبهشت 1392, 20:00 عصر
چه تالار بی حالی هست این تالار:ناراحت:
اکثر پست ها بدون جوابه.مدیران عزیز یه سر هم به این تالار بزنین ثواب داره!!!!!!!

tooraj_azizi_1035
دوشنبه 23 اردیبهشت 1392, 21:11 عصر
شاید باید اجازه بگیری:

Where(x=> Int32.Parse( x.val ) > number)

منبع:http://www.farsimsdn.somee.com/Default.aspx?id=247

ahmad156
سه شنبه 24 اردیبهشت 1392, 08:28 صبح
دوست عزیز همون طور که گفتم اجازه تبدیل به من نمیده!!!زمان اجرا خطا میده.

tooraj_azizi_1035
سه شنبه 24 اردیبهشت 1392, 10:46 صبح
خطا و کد رو بذار

ahmad156
سه شنبه 24 اردیبهشت 1392, 13:02 عصر
LINQ to Entities does not recognize the method 'Int32 Parse(System.String)' method, and this method cannot be translated into a store expression

tooraj_azizi_1035
سه شنبه 24 اردیبهشت 1392, 13:07 عصر
علت اینه که جواب کوئری هنوز تو حافظه نیست. در این دو نمونه کد اولی خطای شما رو می ده و در دومی به خاطر استفاده از ToList نتیجه کوئری به حافظه آورده شده و بنابراین اجازه استفاده از متد رو میده:

1st:

ublic IEnumerable<CourseNames> GetCourseName()
{
var course = from o in entities.UniversityCourses
select new CourseNames
{
CourseID = Convert.ToInt32(o.CourseID),
CourseName = o.CourseName,
};
return course.ToList();
}



2nd:


public IEnumerable<CourseNames> GetCourseName()
{
var courses = from o in entities.UniversityCourses
select new { o.CourseID, o.CourseName };

return courses.ToList() // now we have in-memory query
.Select(c => new CourseNames()
{
CourseID = Convert.ToInt32(c.CourseID), // OK
CourseName = c.CourseName
});
}

ahmad156
چهارشنبه 25 اردیبهشت 1392, 09:14 صبح
دوست عزیز ممنون از جوابتون .
ولی این کار یه جور پاک کردن صورت مسئله هست.

tooraj_azizi_1035
چهارشنبه 25 اردیبهشت 1392, 11:13 صبح
شما قبل از متد Where تون متد ToList() رو بزنید:
.ToList().Where(x=> Int32.Parse( x.val ) > number)
کد های بالا فقط مثالی بود برای شرایطی که این خطا بوجود میاد.

mo.esmp
چهارشنبه 25 اردیبهشت 1392, 12:59 عصر
سلام دوستان

Where(x=>x.val>number)



بر فرز اینکه این کوئری شما اجرا بشه نتیجه چی خواهد بود ؟
SELECT * FROM TableName WHERE val > 9
در نهایت این کوئری Linq به این کوئری SQL تبدیل میشه حالا مشکل کار کجاست ؟ شما ستون val رو بسورت varchar یا nvarchar تعریف کردین که دیتای اون بسورت رشته زخیره میشه و دارید یک مقدار عددی رو با اون مقایسه میکنید که کار اشتباهیه.

x=> Int32.Parse( x.val )
و اگه این خت کد کامپایل بشه و به SQL تبدیل بشه باید این بشه که نمیشه
SELECT CONVERT(INT, var) FROM TableName where val > 9

پس شما ٢ راه داری یا باید خودت کوئری بزنی و مقادیر رو سمت دیتابیس تبدیل کنی و یا اینکه همونتور که دوستمون tooraj_azizi_1035 بخوبی براتون مسال زدن سمت کد همه دیتاها رو بگیری و اول تبدیل کنیی بعد عمل مقایسه رو انجام بدی.