PDA

View Full Version : سوال: خروجی Linq به صورت آرایه



rahe behtari hast
جمعه 17 آذر 1391, 11:35 صبح
من یک جدول با فرمت xml دارم
میخوام یک ستون از جدول رو بریزم داخل یک آرایه ی رشته ای

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


var q=from p in doc.decsendonts("customers");a

select new {name=p.attribute(name).value};a


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



string[] q=from p in doc.decsendonts("customers");a

select new {name=p.attribute(name).value}.toarray();a


اینجاست که اررور میده.

چیکار کنم؟

rahe behtari hast
جمعه 17 آذر 1391, 13:49 عصر
کلا کسی از سوالهای لینکیو استقبال نمیکنه نه ؟!
بچه ها یک کوچولو عجله دارم لطفا

rahe behtari hast
جمعه 17 آذر 1391, 15:00 عصر
من یک برنامه دارم که کاربرهای مختلفی میتونن ازش استفاده کنن. یک سری جدول اس کیو ال هست که اون کاربرها پرشون میکنن و ازشون باید یک بک آپ ایکس ام ال بگیرن
پس من به دو تا چیز نیاز دارم. اول این که بتونم با زدم یک دکمه اطلاعات ایکس ام ال رو وارد اس کیو ال کنم
دوم هم این که بتونم با یک دکمه ی دیگه اطلاعات اس کیو ال رو بریزم داخل یک ایکس ام ال


باری این که اس کیو ال رو بریزم داخل ایکس ام ال
میام تمام ستونهای جدول رو میریزم داخل یک آرایه
بعد ریدف اول همه آرایه ها رو اضافه میکنم به ایکس ام ال
که کاملا درسته و جواب میده:


string[] a = dc.selectproduction().Select(x =>x.P_status.ToString()).ToArray();

string[] b = dc.selectproduction().Select(x =>x.P_name).ToArray();

string[] c = dc.selectproduction().Select(x =>x.P_price.ToString()).ToArray();

string[] d = dc.selectproduction().Select(x =>x.P_mincount.ToString()).ToArray();

string[] f = dc.selectproduction().Select(x =>x.P_maxcount.ToString()).ToArray();

string[] g = dc.selectproduction().Select(x =>x.P_uom).ToArray();

string[] h = dc.selectproduction().Select(x =>x.P_type).ToArray();



XElement y = new XElement("customers");



for (int i = 0; i< a.Count(); i++)

{

y.Add(new XElement("customer", newXAttribute("status",a[i]), new XAttribute("name", b[i]), newXAttribute("price",c[i]), new XAttribute("mincount", d[i]), new XAttribute("maxcount", f[i]), new XAttribute("uom", g[i]), newXAttribute("type",h[i])));

}



y.Save("c:\\n\\customer.xml");

اما برای قسمت دوم
همین کار رو برعکس انجام میدم
اول تمام ستونهای ایکس ام ال رو میریزم داخل یک سری آرایه (که اینجا مشکل دارم) و بعد ردیف اول تمام آرایه ها رو اینسرت میکنم داخل اس کیو ال:



XDocument doc = newXDocument();

doc = XDocument.Load("c:\\n\\customer.xml");



var a = from p in doc.Descendants("customer")

select new{ status = p.Attribute("status").Value};

var b = from p in doc.Descendants("customer")

select new{ name = p.Attribute("name").Value};

var c = from p in doc.Descendants("customer")

select new{ price = p.Attribute("price").Value};

var d = from p in doc.Descendants("customer")

select new{ minacount = p.Attribute("minacount").Value};

var f = from p in doc.Descendants("customer")

select new{ maxacount = p.Attribute("maxacount").Value};

var g = from p in doc.Descendants("customer")

select new{ uom = p.Attribute("uom").Value};

var h = from p in doc.Descendants("customer")

select new{ type = p.Attribute("type").Value};



//fulldelete



for (int i = 0; i< a.Count(); i++)

{

//insert

Mahmoud.Afrad
جمعه 17 آذر 1391, 17:04 عصر
خواهشا کدها رو داخل تگ C# بذارید.

وقتی شما لیست رکوردها(dc.selectproduction()) رو دارید اصلا نیازی به این همه آرایه نیست. باید با همون لیست بازگشتی از dc.selectproduction() کار کنید.
با توجه به کدهاتون و چیزی که متوجه شدم برای ایجاد فایل xml میتونید از کدی شبیه به کد زیر استفاده کنید:

using (Database1Entities model = new Database1Entities())
{
var recordsForBackup = dc.selectproduction();

XElement element = new XElement("customer");

foreach (var record in recordsForBackup)
{
XElement el = new XElement(Convert.ToString(record.P_name),
new XAttribute("Status", Convert.ToString(record.P_status)),
new XAttribute("Price", Convert.ToString(record.P_price)),
new XAttribute("mincount", Convert.ToString(record.P_mincount)),
new XAttribute("maxcount", Convert.ToString(record.P_maxcount)),
new XAttribute("uom", Convert.ToString(record.P_uom)),
new XAttribute("type", Convert.ToString(record.P_type))
);
element.Add(el);
}

XDocument xdoc = new XDocument();
xdoc.Add(element);
xdoc.Save(Application.StartupPath + "//bak");
}


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

XDocument xdoc = XDocument.Load(Application.StartupPath + "//bak");
var recordsForAddToDB = from rec in xdoc.Descendants("customer").Descendants()
select new
{
name = Convert.ToString(rec.Name),
Status = rec.Attribute("P_status").Value,
Price = rec.Attribute("P_price").Value,
mincount = rec.Attribute("P_mincount").Value,
maxcount = rec.Attribute("P_maxcount").Value,
uom = rec.Attribute("P_uom").Value,
type = rec.Attribute("P_type").Value
};

using (Database1Entities model = new Database1Entities())
{
foreach (var record in recordsForAddToDB)
{
tbl t = new tbl();
t.name = record.name;
t.Status = record.Status;
t.Price = record.Price;
t.mincount = record.mincount;
t.maxcount = record.maxcount;
t.uom = record.uom;
t.type = record.type;

model.tbl.AddObject(t);
}
model.SaveChanges();
}

rahe behtari hast
جمعه 17 آذر 1391, 18:40 عصر
خب مهندس من دو جای کد به مشکل برخوردم


using (Database1Entities model = new Database1Entities())
{ }
یکی اینه. من Database1Entities ندارم. نمیشناستش. منظورتون که dataclass1contest که نیست؟ آخه اون رو هم که گذاشتم جواب نداد. راستی این روش استفاده از using رو بلد نبودم. نمیدونم یعنی چی!

مسئله دوم هست
بعضی از متغییرهام مثل price از جنس عدده یا status از جنس bool هست. هر قسمت از کد که میخوام تبدیلش کنم اجازه نمیده. و در این قسمت از کد زیرشون خط میکشه


t.name = record.name;
t.Status = record.Status;
t.Price = record.Price;
t.mincount = record.mincount;
t.maxcount = record.maxcount;
t.uom = record.uom;
t.type = record.type;

راستی لینک تشکر خرابه درست شد میزنمش!:لبخندساده:

rahe behtari hast
جمعه 17 آذر 1391, 19:44 عصر
دوستان این تاپیک رو امشب جواب بدید من یکم کارم فوریه

rahe behtari hast
شنبه 18 آذر 1391, 11:18 صبح
لطفا اين دو اشكال رو برام حل كنيد من بتونم برنامه ام رو ادامه بدم

rahe behtari hast
شنبه 18 آذر 1391, 15:15 عصر
دوستان شما را چه شده كه من هي اين تاپيك رو ميبرم بالا باز كسي جواب ميدهد و خودش ميايد پايين. كار واجب است نا سلامتي!

mehrbani
شنبه 18 آذر 1391, 17:36 عصر
تلفظ صحیح لینک هست نه لینکیو :)
سعی کنین برنامه رو طوری بنویسین که نوع داده برگشتی IQueryable باشه بعد متد ToArray رو Call کنین

rahe behtari hast
شنبه 18 آذر 1391, 22:16 عصر
شما یه نمونه پروژه بزار (کم حجم باشه).
خب بلاخره آپلود شد
http://rahe-behtary-hast.persiangig.com/backupproject.zip

فقط پایگاه داده اش داخلش نیست
یک جدول به ایم table_1
که سه تا ستون داره
t_name >nvarchar(50)a
t_price > int
t_status >bit

و یک پروسیجر به اسم
selecttable1

rahe behtari hast
شنبه 18 آذر 1391, 22:19 عصر
تلفظ صحیح لینک هست نه لینکیو :)
سعی کنین برنامه رو طوری بنویسین که نوع داده برگشتی IQueryable باشه بعد متد ToArray رو Call کنین

آقا از فکر آرایه اومدم بیرون
این دوستمون انگار راه بهتری از آرایه داره...

Mahmoud.Afrad
شنبه 18 آذر 1391, 23:38 عصر
چون linq to sql کار کردی باید به جای Database1Entities باید نام مدل linq رو قرار بدی. در بازگردانی اطلاعات هم اون price و... باید به نوع موردنیاز convert بشن.

private void btnBackup_Click(object sender, EventArgs e)
{
if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
using (DataClasses1DataContext context = new DataClasses1DataContext())
{
var recordsForBackup = context.Table_1s;

XElement element = new XElement("Production");

foreach (var record in recordsForBackup)
{
XElement el = new XElement(Convert.ToString(record.t_name),
new XAttribute("Price", Convert.ToString(record.t_price)),
new XAttribute("Status", Convert.ToString(record.t_status))
);
element.Add(el);
}

XDocument xdoc = new XDocument();
xdoc.Add(element);
xdoc.Save(saveFileDialog1.FileName);

}
}
}

private void btnRestore_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
XDocument xdoc = XDocument.Load(openFileDialog1.FileName);

var recordsForAddToDB = from rec in xdoc.Descendants("Production").Descendants()
select new
{
name = Convert.ToString(rec.Name),
price = Convert.ToInt32(rec.Attribute("Price").Value),
status = Convert.ToBoolean(rec.Attribute("Status").Value),
};

using (DataClasses1DataContext context = new DataClasses1DataContext())
{
/* clear table
foreach (var record in context.Table_1s)
{
context.Table_1s.DeleteOnSubmit(record);
}
*/

foreach (var record in recordsForAddToDB)
{
Table_1 t = new Table_1();
t.t_name = record.name;
t.t_price = record.price;
t.t_status = record.status;

context.Table_1s.InsertOnSubmit(t);
}

context.SubmitChanges();
}
}
}

rahe behtari hast
دوشنبه 20 آذر 1391, 07:55 صبح
دوست عزيز ممنون بخاطر كمكت
از كدها استفاده كردم همه چيز درسته و كار ميكنه. فقط يك اشكال وجود داره و چندتا سوال:

اشكال:
در قسمت Open من وقتي عين كدهاي شما رو استفاده كردم جواب داد اما وقتي كدها رو متناسب با جدول خودم تغيير دادم روي اين خط
context.submitchanges();
خطاي ".cannot add the entity with a key that is already in use" رو ميده. من هر چي نگاه ميكنم جايي اشتباه نكردم.

سوال:
چطور مشخص كنم كه موقع Open كردن اگر فايل خطا داشت و اطلاعات اون xml همه اش يا قسمتيش متناسب با جدولهاي من نبود پيغام بده. و حتي در بهترين حالت اصلا محتويات جدولهاي database رو هم تغيير نده.

سوال:
من تا الان هميشه از اين روش استفاده ميكردم كه در SQL براي select يك proc كلي مينوشتم كه تمام محتويات جدول رو انتخاب كنه. يك delete كلي هم مينوشتم كه تمام محتويات جدول رو پاك كنه يك delete موردي مينوشتم و يك insert و update و از اونها داخل C#‎‎ با كمك Linq استفاده ميكردم.
اما شما از دستورات:
context.deleteonsubmit(a);
context.insertonsubmit(a);
context.submitchanges();
استفاده ميكنيد. ميشه يكم برام توضيح بديد. ضمنا deleteonsubmit جواب نداد مجبور شدم از يك پرويجر استفاده كنم.

سوال:
آيا اين دو سري كد در عمل با هم فرق ميكنه؟:

private void btnBackup_click(object sender,EventArgs e)
{
if(savefiledialog1.showdialog()==system.windows.fo rm.Dialogresult.ok)
{
//دستورات
}

}
و اين كد:

private void btnBackup_click(object sender,EventArgs e]
{
savefiledialog1.showdialog();
}

[private void savefiledialog1_fileOK(object sender,cancel EventArgs e
{
//دستورات
}


سوال:
وقتي با استفاده از لينكيو يك پايگاه داده رو فراخواني ميكنيم و ميريزيم داخل dataclass1datacontext اگر اون پايگاه داده به هر دليلي وجود نداشت چه اتفاقي ميافته؟ و من براي جلوگيري از اين خطا چه دستوري رو كجا بايد بنويسم؟

ممنون از وقتي كه ميذاريد :لبخندساده: