ورود

View Full Version : سوال: عدم درج داده ی تکراری در پایگاه داده (LINQ)



hadimtn
شنبه 12 اردیبهشت 1394, 13:52 عصر
سلام.
یه Query میخوام که از ورود اطلاعات تکراری در بانک جلوگیری کنه؟!

SabaSabouhi
شنبه 12 اردیبهشت 1394, 15:38 عصر
سلام.
یه LINQ Query میخوام که از ورود اطلاعات تکراری در بانک جلوگیری کنه؟!

سلام
پرسش اشتباه هست.
کلمه‌ی Query که در خود واژه‌ی LinQ مستتر هست و نیازی به ذکر مجددش نیست، به معنی پرس‌وجو هست. یعنی
مقداری رو از دیتابیس دریافت می‌کنه و به شما تحویل می‌ده. پس هیچ ارتباطی با «ورود اطلاعات به دیتابیس» نداره.

برای جلوگیری از ثبت اطلاعات تکراری در دیتابیس روی جدول‌های اندیس‌های یکتا تعریف کن.

اگر هم منظورت اینه که اطلاعات تکراری موجود در دیتابیس رو بدون تکرار نشون بده می‌تونی از متد Distinct استفاده کنی.

صبا صبوحی

hadimtn
شنبه 12 اردیبهشت 1394, 23:44 عصر
کلمه‌ی Query که در خود واژه‌ی LinQ مستتر هست و نیازی به ذکر مجددش نیست،

بله درسته! ولی چیکار کنم... منم شنیدم: کوئری های لینک!!!
اولین چیزی که در مورد LINQ شنیدم این بود که مخفف چی هست...!!!؟




برای جلوگیری از ثبت اطلاعات تکراری در دیتابیس روی جدول‌های اندیس‌های یکتا تعریف کن.



گزینه ای که بررسی میشه " کـلـیـد " نیست!!! میخوام بدونم چه جوری میشه یک ستون از جدول رو با اطلاعات TextBox مقایسه کرد... ؟!

SabaSabouhi
یک شنبه 13 اردیبهشت 1394, 07:54 صبح
بله درسته! ولی چیکار کنم... منم شنیدم: کوئری های لینک!!!
اولین چیزی که در مورد LINQ شنیدم این بود که مخفف چی هست...!!!؟



گزینه ای که بررسی میشه " کـلـیـد " نیست!!! میخوام بدونم چه جوری میشه یک ستون از جدول رو با اطلاعات TextBox مقایسه کرد... ؟!

سلام
من هم نگفتم که «کلید»اش کن، گفتم اندیس یکتا روش بگذار. کلید اصلی به صورت خودکار یه اندیس یکتا داره، اما دلیل نمی‌شه که
هر اندیس یکتایی کلید باشه.

شما با EF و LinQ اگه کار می‌کنی، برای هر جدول یک کلاس تعریف می‌کنه و با خوندن رکورد مورد نظرت می‌تونی یه Instance از اون
کلاس رو به‌دست بیاری. برای مقایسه هم از فیلدهای اون رکورد استفاده می‌کنی.
مثلاً:

var item = DbContext.Users.SingleOrDefault( x=>x.Name == TextBox1.Text );
if ( item == null ) return;
.
.
.



صبا صبوحی

hadimtn
یک شنبه 13 اردیبهشت 1394, 14:17 عصر
سلام


من هم نگفتم که «کلید»اش کن، گفتم اندیس یکتا روش بگذار. کلید اصلی به صورت خودکار یه اندیس یکتا داره، اما دلیل نمی‌شه که
هر اندیس یکتایی کلید باشه.

اندیس یکتا رو دقیقاً نفهمیدم چیه ولی مشکل حل شد!



شما با EF و LinQ اگه کار می‌کنی، برای هر جدول یک کلاس تعریف می‌کنه و با خوندن رکورد مورد نظرت می‌تونی یه Instance از اون
کلاس رو به‌دست بیاری. برای مقایسه هم از فیلدهای اون رکورد استفاده می‌کنی.

دو فیلد رو میخواستم بررسی کنم برای تکرای بودن داده که اینجوری نوشتم:




var db = new FLinqDataContext();
var RItem = db.ObjectTables.SingleOrDefault(x=>x.نام_کالا == txt_name.Text & x.نشان==BrandComboBox.SelectedValue.ToString() );
if(RItem == null)
{
ObjectTable tb = new ObjectTable()
{
نام_کالا = _objName,
واحد_شمارش = _objUnit,
نشان = _objBrand,
};


db.ObjectTables.InsertOnSubmit(tb);
db.SubmitChanges();
Object_Viewer1.DataSource = db.ObjectTables;


MessageBox.Show("Done!","Resulte");
}
else
{
MessageBox.Show("Exist","Resulte");
}




فقط یه سوال!؟ چرا از SingleOrDefault استفاده شده؟! Single و Where رو هم امتحان کردم جواب داد.

SingleOrDefault و Single رو بگین چی هستن؟! یه سوال دیگه هم این که تو کد پایین وقتی Single() رو نمیذارم فیلدهای جدول نمیاد؟! این Single() رو هم بگین چیه...


var query = db.ObjectTables.Where(c => c.کد_کالا == SelectedIndexId).Single();
query.نام_کالا = _ObjectN;
query.واحد_شمارش = _Unit;
query.نشان = _Brand;

SabaSabouhi
یک شنبه 13 اردیبهشت 1394, 15:33 عصر
سلام
این که کلی سوال شد. :لبخندساده:

1. از اندیس یکتا منظورم Unique Index بود. وقتی جدول رو می‌سازی می‌تونی براش Index تعیین کنی، که برای دو منظور
یکتا بود و بالا بردن سرعت استفاده می‌شه. ( کلید اصلی هم یه جوری اندیس به حساب میاد )
اگه نوع اندیس رو «Unique Key» تعریف کنی، دیتابیس اجازه نمی‌ده از اون ترکیب ( ممکنه یک یا چند ستون رو شامل بشه ) بیش
از یک مورد تو دیتابیس ثبت بشه. و در صورت اقدام به ثبت خطا می‌ده.

2. چیزی که نوشتی، روش کارت صحیح هست.

3. یه توضیح کوچیک لازم داره، خیلی مختصر می‌گم، امیدوارم که قضیه برات روشن بشه.

متد Where منجر به یک IQueryable می‌شه. یعنی خروجی چیزی هست که با استفاده از اون شما می‌تونی
با کمک متد ToList ازش یه IEnumerable بسازی. پس در واقع متد Where یک فرمول بر می‌گردونه که منجر
به یه مجموعه می‌شه.

با کمک متدهای Single, SingleOrDefault, First, FirstOrDefault یا متدهایی از این دست می‌تونی
یک سطر از اطلاعات رو واکشی کنی. ( مجموعه تبدیل به تک رکورد می‌شه )
این متدهای اخیر ( مثل Single ) می‌تونن خودشون به صورت مستقل هم عمل کنن، و اون شرط‌ها رو داخلشون بنویسی.
یعنی فرقی بین این که Where رو جداگانه بنویسی و این که شرط رو داخل Single بیاری نیست.

* فرق این متدها:
First
اولین سطر اطلاعات رو برمی‌گردونه، انتظار اینه که حداقل یک سطر وجود داشته باشه، در غیر این صورت خطا می‌ده
FirstOrDefault
اولین سطر اطلاعات رو برمی‌گردونه، اگه هیچ اطلاعاتی وجود نداشته ( مثلاً جدول خالی بود )، Null بر می‌گردونه
Single
تنها سطر موجود رو بر می‌گردونه ( با توجه به شرایط ) اگه هیچ سطری وجود نداشته باشه، یا بیش از یک سطر وجود داشته باشه باعث بروز خطا می‌شه.
SingleOrDefault
تنها سطر موجود رو بر می‌گردونه، اگه هیچ سطری وجود نداشت، Null برمی‌گردونه و اگه بیش از یه سطر وجود داشت، خطا می‌ده.

نکته‌ی خیلی مهم: تو ارتباط با دیتابیس از متدهای Last, LastOrDefault نمی‌شه استفاده کرد، چون این متدها
باید تبدیل به فرمان‌های Sql بشن و فرمانی برای آخرین سطر تو Sql وجود نداره. اگه رکورد آخر رو خواستی،
باید با استفاده از OrderBy ترتیب حضور سطرها رو برعکس کنی و بعد با استفاده از First رکورد اول ( که در واقع
آخرین رکورد هست ) رو بگیری.

صبا صبوحی