PDA

View Full Version : حرفه ای: به دست آوردن ID همه Child ها و join کردن آن ها در یک string



pep30cula
شنبه 08 آذر 1393, 14:27 عصر
سلام

من یک مدل دارم که بصورت زیر تعریف شده:

public class Category{
public int Id { get; set; }
public int ParentCategoryId { get; set; }
public string ChildIDs { get; set; }
}

میخوام بصورت بازگشتی فیلد ChildIDs رو با همه ID های فرزند پر کنم. مثل این: 7,17,19,22,36
من با کوئری زیر فقط تونستم که فرزندان سطح اول رو برگردونم

from cg in db.Categorieswhere cg.Id == id
join urc in
(from x in db.UrlRecords where x.EntityName == "Category" select x) on cg.Id equals urc.EntityId into urccg
from f in urccg.DefaultIfEmpty()
select new
{
cg,
f,
ParentCategoryId = cg.ParentCategoryId,
ChildIds = string.Join(",", (from x in db.Categories where x.ParentCategoryId == cg.Id select x.Id))
}

این سوال رو در stackoverflow هم مطرح کردم و هنوز پاسخی دریافت نکردم
http://stackoverflow.com/questions/27185555/recursively-select-all-child-ids-and-join-in-one-string-using-linq

parvizwpf
پنج شنبه 13 آذر 1393, 08:24 صبح
میشه بیشتر توضیح بدید؟

Mahmoud.Afrad
پنج شنبه 13 آذر 1393, 22:38 عصر
public class Category
{
public int Id { get; set; }
public List<Category> Childs { get; set; }

public Category()
{
Childs = new List<Category>();
}
}

private void button1_Click(object sender, EventArgs e)
{
Category c1 = new Category {Id = 1};
Category c2 = new Category {Id = 2};
c1.Childs.Add(c2);
Category c3 = new Category {Id = 3};
c1.Childs.Add(c3);
Category c4 = new Category {Id = 4};
c2.Childs.Add(c4);
Category c5 = new Category {Id = 5};
c4.Childs.Add(c5);


MessageBox.Show(GetChildIds(c1));
}

private string GetChildIds(Category cat)
{
StringBuilder sb = new StringBuilder();
foreach (Category c in cat.Childs)
{
sb.Append(c.Id + ",");
if (c.Childs != null)
{
sb.Append(GetChildIds(c));
}
}

return sb.ToString();
}

pep30cula
سه شنبه 18 آذر 1393, 09:30 صبح
من به ساختار مدلم نمیتونم دست بزنم و همچنین باید با Query این رشته رو به دست بیارم. با C# این کارو کردم ولی خیلی سرعتش بد بود.

شما فرض کنید که یه جدول ساده با ساختار بالا داریم و با linq یا t-sql میخوایم همه فرزندای یک والد رو بدست بیاریم و با هم در یک رشته ذخیره کنیم. ما فرزندهای فرزند رو هم تا پایین ترین سطح نیاز داریم.



ممنون