تبدیل یک query به یک لیست داده ها
سلام
من یه query دارم بصورت زیر که میخام داده ها بصورت یه لیست باشن . برای اینکار یه لیست دستی از داده های جدول یک درست میکنم و با یه حلقه for یه لیست دیگه از داده های جدول دو . و هر دو رو در یک لیست قرار میدم . آیا روش بهتری برای اینکار وجود داره ؟ یا باید کارها رو بصورت دستی انجام بدم ؟
ممنون
var product= dbcontext.table1
.Include(p => p.table1table2)
.ThenInclude(pg => pg.Table2)
.ToList();
نقل قول: تبدیل یک query به یک لیست داده ها
لطفا سوالتون واضح تر مطرح کنید هدفتون چی هست
بکارگیری حلقه های for تو در تو برای واکشی یک موجودیت شاید مناسب باشند
مثلا فرض کنید یک کالا و جزئیات کالا را بخواهیم نمایش دهیم
وگرنه برای نمایش چند کالا کارایی ندارد
نقل قول: تبدیل یک query به یک لیست داده ها
ممنون از پاسختون .
یک کالا و جزییاتش رو بدست بیارم و اونو به یک داده جیسون تبدیل کنم . مشکلم با جدولهای واسط هست که تنها راه زدن حلقه های for برای گرفتن اطلاعات و دستی یه جیسون ساختن رو تونستم انجام بدم . میخام بدونم در این شرایط روش های بهتری وجود داره ؟
نقل قول: تبدیل یک query به یک لیست داده ها
وقتی navigation property هست چرا نیاز به حلقه for دارید؟
آیا یک مقدار خاصی از درون کد به اطلاعات واکشی شده از جدول کالا ها اضافه می کنید
لطفا ساختار مدل هاتون ارسال کنید
نقل قول: تبدیل یک query به یک لیست داده ها
بسیار ممنون
جدول 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();
نقل قول: تبدیل یک query به یک لیست داده ها
این کوئری چه مشکلی دارد؟
شما میتونید در قسمت ویو این رکوردهای بازیابی شده را در قسمت مربوطه خود نمایش بدید و نیاز به تبدیل شدن به جیسون هم نیست
به نظر من شما نمیدونید چطور نمایش بدید اینطور هست؟
نقل قول: تبدیل یک query به یک لیست داده ها
ممنون از پاسختون .
اگه بصورت عادی بخام اطلاعات رو نمایش بدم مشکلی ندارم اینکه میخام داده ها بصورت جیسون بشن چون اونا رو برای جاوااسکریپت ارسال میکنم و در ویو یه سری کارهای همزامن رو باید انجام بدم .
مشکل من تبدیل رکوردهای بازیابی شده به یک داده جیسون در یک ریپازیتوری هست .
اگر داده ها رو در کنترلر تشکیل بدم مشکلی نیست اما وقتی بخام از ریپازیتوری دریافت کنم چون نوعش داینامیک میشه داده ها رو بصورت نال در ویو بهم نشون میده .
در کنترلر بصورت زیر کدها رو مینویسم و مشکلی نیست :
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 قرار بدم زمانیکه داده رو از کنترلر دریافت کنم نمیتونم پردازش رو روش انجام بدم و به این نتیجه رسیدم یه جوری داده رو از نوع جیسون یا همون لیست معمولی بگیرم که بتونم در کنترلر ازش استفاده کنم . سوال من این پیدا کردن این روش هست ؟ ممنون و سپاسگزار
نقل قول: تبدیل یک query به یک لیست داده ها
برگشتی اکشن بصورت 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>