PDA

View Full Version : تبدیل یک query به یک لیست داده ها



sara_t
پنج شنبه 22 شهریور 1397, 18:47 عصر
سلام

من یه query دارم بصورت زیر که میخام داده ها بصورت یه لیست باشن . برای اینکار یه لیست دستی از داده های جدول یک درست میکنم و با یه حلقه for یه لیست دیگه از داده های جدول دو . و هر دو رو در یک لیست قرار میدم . آیا روش بهتری برای اینکار وجود داره ؟ یا باید کارها رو بصورت دستی انجام بدم ؟
ممنون


var product= dbcontext.table1
.Include(p => p.table1table2)
.ThenInclude(pg => pg.Table2)
.ToList();

ali_md110
پنج شنبه 22 شهریور 1397, 23:31 عصر
لطفا سوالتون واضح تر مطرح کنید هدفتون چی هست
بکارگیری حلقه های for تو در تو برای واکشی یک موجودیت شاید مناسب باشند
مثلا فرض کنید یک کالا و جزئیات کالا را بخواهیم نمایش دهیم
وگرنه برای نمایش چند کالا کارایی ندارد

sara_t
جمعه 23 شهریور 1397, 12:29 عصر
ممنون از پاسختون .

یک کالا و جزییاتش رو بدست بیارم و اونو به یک داده جیسون تبدیل کنم . مشکلم با جدولهای واسط هست که تنها راه زدن حلقه های for برای گرفتن اطلاعات و دستی یه جیسون ساختن رو تونستم انجام بدم . میخام بدونم در این شرایط روش های بهتری وجود داره ؟

ali_md110
جمعه 23 شهریور 1397, 12:37 عصر
وقتی navigation property هست چرا نیاز به حلقه for دارید؟
آیا یک مقدار خاصی از درون کد به اطلاعات واکشی شده از جدول کالا ها اضافه می کنید

لطفا ساختار مدل هاتون ارسال کنید

sara_t
جمعه 23 شهریور 1397, 13:50 عصر
بسیار ممنون

جدول product :


public class Product
{
public int Id { get; set;

public string Title { get; set; }
public string Body { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
public virtual ICollection<Image> Images{ get; set; } = new HashSet<Image>();

public virtual ICollection<ProductComment> ProductComments { get; set; } = new HashSet<ProductComment>();

public virtual ICollection<ProductGroup> ProductGroups { get; set; } = new HashSet<ProductGroup>();
}



جدول گروه ها :


public class Group
{

public int Id { get; set; }

public string Name { get; set; }


public int? ParentId { get; set; }
public virtual Group Parent { get; set; }


public virtual ICollection<Group> Children { get; set; } = new HashSet<Group>();
public virtual ICollection<ProductGroup> ProductGroups { get; set; } = new HashSet<ProductGroup>();

}



جدول ProductGroup



public class
ProductGroup
{
public int ProductId { get; set; }
public virtual Product Product{ get; set; }
public int GroupId { get; set; }
public virtual Group Group { get; set; }
}


جدول Image



public class Image
{
public int Id { get; set; }

public string Name { get; set; }
public string Description { get; set; }

public bool DefaultPic { get; set; }
public int ProductId { get; set; }
public virtual Product Product{ get; set; }


}



جدول
و اینکه جدول محصولات با چند تا جدول دیگه رابطه چند به چند دارن که ارتباطاتشون مثه جدول گروه انجام دادم. حالا یه query میزنم به این صورت که یه محصول رو با جزییات کامل دریافت کنم :



var qProduct = _context.Products.Where(p=>p.Id==id)
.Include(p => p.Images)
.Include(p => p.User)
.Include(p => p.ProductGroups)
.ThenInclude(pg => pg.Group)
.Include(p => p.ProductComment)
.ThenInclude(pk => pk.Comment)
.ToList();

ali_md110
شنبه 24 شهریور 1397, 22:30 عصر
این کوئری چه مشکلی دارد؟
شما میتونید در قسمت ویو این رکوردهای بازیابی شده را در قسمت مربوطه خود نمایش بدید و نیاز به تبدیل شدن به جیسون هم نیست

به نظر من شما نمیدونید چطور نمایش بدید اینطور هست؟

sara_t
یک شنبه 25 شهریور 1397, 12:20 عصر
ممنون از پاسختون .

اگه بصورت عادی بخام اطلاعات رو نمایش بدم مشکلی ندارم اینکه میخام داده ها بصورت جیسون بشن چون اونا رو برای جاوااسکریپت ارسال میکنم و در ویو یه سری کارهای همزامن رو باید انجام بدم .

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

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


public ExpandoObject ToExpando(object anonymousObject)
{
IDictionary<string, object> anonymousDictionary = new RouteValueDictionary(anonymousObject);
IDictionary<string, object> expando = new ExpandoObject();
foreach (var item in anonymousDictionary)
expando.Add(item);
return (ExpandoObject)expando;
}
public IActionResult Edit(int? id)
{
var groups = _uof.GroupRepository.Get();

var qProduct = _dataContext.Products.Where(p => p.Id == id)
.Include(p => p.ProductGroup)
.ThenInclude(ps => ps.Group)
.ToList();

var tt = qProduct[0].RecipeGroups.Select(x => new
{
Id = x.Group.Id,
Name = x.Group.Name
}).ToList();

var model = ToExpando(new { var1 = groups, var2 = tt });
return View(model);
}







حالا اگر قسمت بدست آوردن جزییات یک محصول رو در یک ریپازیتوری بنویسم و داده رو بصورت جیسون که نوعش رو ExpandoObject قرار بدم زمانیکه داده رو از کنترلر دریافت کنم نمیتونم پردازش رو روش انجام بدم و به این نتیجه رسیدم یه جوری داده رو از نوع جیسون یا همون لیست معمولی بگیرم که بتونم در کنترلر ازش استفاده کنم . سوال من این پیدا کردن این روش هست ؟ ممنون و سپاسگزار

ali_md110
پنج شنبه 29 شهریور 1397, 14:30 عصر
برگشتی اکشن بصورت json استفاده کنید
مثلا


[HttpGet]
public ActionResult Edit()
{


dynamic expando = new ExpandoObject();
expando.var1 = "ali";
expando.var2 = "Ebrahimi";

var json = JsonConvert.SerializeObject(expando);

return Content(json, "application/json");
}


و در ویو میتونید اینجوری صدا بزنید



<script>
$.getJSON("@Url.Action("Edit", "Home")", function(data)
{
$.each(data,
function (index, item) {
console.log(item);

});

});

</script>