PDA

View Full Version : سوال: کوئری استرینگ با ENTITY FRAMEWORK



aria2006
دوشنبه 23 بهمن 1396, 12:37 عصر
سلام- یک webapi در محیط asp.net mvc4 دارم که به شیوه entitiyframework با پایگاه داده در ارتباطه.
یک دستور select بصورت زیر دارم که بعد از اجرا جواب رو نمیاره و پیغام خطاش اینه :
ora-00932:inconsistent datatypes:expected NCHAR got NCLOB

اینم از دستوراتی که اجرا میشن:


public IEnumerable<Milad.Models.DomainModels.A_LASTNOBAT> GetGis(string id)
{

var model3 = blnobat.Select().OrderBy(p => p.A_NOBAT).Where(p => p.A_COUNTERNO.Value.ToString().Contains(id));
return (model3).Tostring();
}



ضمنا فیلد A_COUNTERNO در دیتابیس از نوع number هستش.
ممنون از راهنماییتون

a.golzar66
دوشنبه 23 بهمن 1396, 12:51 عصر
var model3 = blnobat.Where(p => p.A_COUNTERNO.Value.ToString().Contains(id)).Selec t(p=>p.A_NOBAT).OrderBy(p => p.A_NOBAT);

aria2006
دوشنبه 23 بهمن 1396, 17:02 عصر
var model3 = blnobat.Where(p => p.A_COUNTERNO.Value.ToString().Contains(id)).Selec t(p=>p.A_NOBAT).OrderBy(p => p.A_NOBAT);







سلام- فرقی نکرد هنوزم همون خطا رو میده. ضمن اینکه از orderby آخر دستور هم ایراد میگیره...

aria2006
سه شنبه 24 بهمن 1396, 10:42 صبح
دوستان کسی نظری نداره ؟

a.golzar66
سه شنبه 24 بهمن 1396, 11:06 صبح
orderby رو حذف کن ببین پیغام خطاش فرق میکنه؟

aria2006
سه شنبه 24 بهمن 1396, 11:29 صبح
orderby رو حذف کن ببین پیغام خطاش فرق میکنه؟

این کارم کردم ولی فایده ای نداشت:


var model3 = blnobat.Select().Where(p => p.A_COUNTERNO.Value.ToString().Contains(id));


همین پیغام خطا رو میده:

ORA-00932: inconsistent datatypes: expected NCHAR got NCLOB

a.golzar66
سه شنبه 24 بهمن 1396, 11:42 صبح
دستور select چیه کارش اونم حذف کن ببین کد راه میده

aria2006
سه شنبه 24 بهمن 1396, 11:51 صبح
دستور select چیه کارش اونم حذف کن ببین کد راه میده

خب من میخوام یه تعداد رکورد رو از دیتابیس select کنم.اگه اونو بردارم که دیگه دستوری باقی نمیمونه!

hakim22
سه شنبه 24 بهمن 1396, 12:19 عصر
وقتی Where دارید نیاز به Select ندارید.

a.golzar66
سه شنبه 24 بهمن 1396, 12:20 عصر
فکر کنم باید از دستور ToList استفاده کنی و اخر خط هم باید بنویسی نه وسطش

ali_md110
سه شنبه 24 بهمن 1396, 14:49 عصر
ابتدا کوئریتون بدون SELECT و WHERE و ORDER BY اجرا کنید اگر به خطا برخورد کردید ممکنه فیلدی در دیتابیس از نوع NCLOB باشه و سمت calss های POCO شما از نوع string تعریف کرده باشید و خطای مربوط به مپ کردن فیلدها باشه و این خطا ربطی به شرط where نداشته باشه
و اگر اینجور بود تنظیمات کلاس های EF رو در برنامه تغییر بدید

aria2006
سه شنبه 24 بهمن 1396, 18:16 عصر
ابتدا کوئریتون بدون SELECT و WHERE و ORDER BY اجرا کنید اگر به خطا برخورد کردید ممکنه فیلدی در دیتابیس از نوع NCLOB باشه و سمت calss های POCO شما از نوع string تعریف کرده باشید و خطای مربوط به مپ کردن فیلدها باشه و این خطا ربطی به شرط where نداشته باشه
و اگر اینجور بود تنظیمات کلاس های EF رو در برنامه تغییر بدید

با تشکر از همگی
کوئری را بدون select , orderby تست کردم خطای اول سر جاشه. ضمن اینکه این کوئری فقط با فیلدهای number(int) این خطا رو میده یعنی اگه بنده فیلدی که در این دستور داره جستجو میشه(A_COUNTERNO) بردارم و بجاش یک فیلدی که داخل دیتابیس از نوع varchar هست بذارم درست کار میکنه.
در خصوص مپ بودن نوع فیلد A_COUNTERNO در دیتابیس اوراکل number با طول 10 هستش و کلید اصلی نیست. داخل کلاس EF هم بصورت زیره:

public Nullable<int> A_COUNTERNO { get; set; }


والا دیگه موندم علت خطاش چیه؟

ali_md110
سه شنبه 24 بهمن 1396, 20:04 عصر
ممکنه پروایدر اوراکل با روش dbfirst این مشکلات رو داشته باشه فیلد number بشتر از 22 بایت نمیتونه بپذیره در صورتیکه varchar تا 4k هم فضا میگیره
و یا ممکنه این تبدیل به toString مشکلات شما باشه
ابتدا مقدار Contains(id) رو دستی ست کنید

بجای id یک مقدار واقعی درون دیتابیس قرار بدید


Where(p => p.A_COUNTERNO.Value==id));


در ضمن شما چرا فیلد درون دیتابیس رو دارید کاست میکنید ؟


p.A_COUNTERNO.Value.ToString()

بجای اون پارامتر ورودی رو به عدد کاست کنید


این لینک ها رو هم ببینید
https://stackoverflow.com/questions/32271718/oracle-entity-framework-call-custom-function-edit-distance
و
https://stackoverflow.com/questions/27525078/entity-framework-and-string-as-nclob-on-oracle-db (https://stackoverflow.com/questions/27525078/entity-framework-and-string-as-nclob-on-oracle-db)

aria2006
چهارشنبه 25 بهمن 1396, 12:09 عصر
ممکنه پروایدر اوراکل با روش dbfirst این مشکلات رو داشته باشه فیلد number بشتر از 22 بایت نمیتونه بپذیره در صورتیکه varchar تا 4k هم فضا میگیره
و یا ممکنه این تبدیل به toString مشکلات شما باشه
ابتدا مقدار Contains(id) رو دستی ست کنید

بجای id یک مقدار واقعی درون دیتابیس قرار بدید


Where(p => p.A_COUNTERNO.Value==id));


در ضمن شما چرا فیلد درون دیتابیس رو دارید کاست میکنید ؟


p.A_COUNTERNO.Value.ToString()

بجای اون پارامتر ورودی رو به عدد کاست کنید


این لینک ها رو هم ببینید
https://stackoverflow.com/questions/32271718/oracle-entity-framework-call-custom-function-edit-distance
و
(https://stackoverflow.com/questions/27525078/entity-framework-and-string-as-nclob-on-oracle-db)https://stackoverflow.com/questions/27525078/entity-framework-and-string-as-nclob-on-oracle-db






خیلی لطف کردید.سپاسگزارم. حق با شماست . کوئری خروجی داد.
به همین صورت اصلاح کردم، هم با select هم بدون select جواب میده:


var model3 = blnobat.select().Where(p => p.A_COUNTERNO.Value == id).ToList();


وروردی تابع هم بجای استرینگ از نوع int قرار دادم.