PDA

View Full Version : concat



forestasphalt
پنج شنبه 13 تیر 1392, 19:31 عصر
با سلام من چند تا جدول دارم که باید اطلاعات همشو در یک قسمت جمع کنم و به ویو بفرستم
از uniion استفاده میکردم بهتر بود ولی union ظاهر ترتیب رو حفظ نمیکنه
اگه اینکار با ویو مدل بشه انجام داد میشه محشر!


var catCamera = Context.CatCamera.Select(p => new { p.Id, p.catDetails, p.category });
var catflash = Context.CatFlash .Select(p => p.Id, p.catDetails, p.category });
var catLenz = Context.CatLenz.Select(p => new { p.Id, p.catDetails, p.category });
var CatAccessories = Context.catAccessories.Select(p => new { p.Id, p.catDetails, p.category });
var concat = catflash.Concat(catCamera.Concat(catLenz.Concat(Ca tAccessories)));
ViewBag.Categorys =concat;


ViewBag.Categorys شامل اطلاعاتی که میخوام هست ولی وقتی میخوام توی ویو استفاده کنم با foreach به فیلدهاش نمیتونم دسترسی پیدا کنم
اینکار با ویو مدل شدنی؟
لطفا راهنمایی کنید
با تشکر

younesdoost
پنج شنبه 13 تیر 1392, 20:16 عصر
چرا به فیلداش دسترسی ندارید؟
ممکنه موقع نوشتن کد وقتی توی foreach از ViewBag استفاده می کنید VS براتون حدسی رو نیاره اما شما به کار خودتون ادامه بدید و کدتون رو بنویسید و اسم فیلدها رو خودتون کامل بنویسید.موقع اجرا خودش پیدا می کنه.

forestasphalt
پنج شنبه 13 تیر 1392, 20:59 عصر
با تشکر از شما
Microsoft.CSharp.RuntimeBinder.RuntimeBinderExcept ion: 'object' does not contain a definition for 'Id'
برای تمامه فیلدها همینجوری خطا میده

younesdoost
جمعه 14 تیر 1392, 00:06 صبح
این لینک فکر می کنم بتونه مشکلتون رو حل بکنه:
http://stackoverflow.com/questions/7652749/object-does-not-contain-a-definition-for-x

Saeed_m_Farid
شنبه 15 تیر 1392, 13:14 عصر
قبل هرچیز، فکر کنم خودتون هم واقفید که این طراحی مدلهاتون کاملاً اشتباه هست و اگه هنوز پایه پروژه رو روی این نوع طراحی نذاشتید و می تونید عوضش کنید؛ حتماً اینکار رو بکنید.
می تونید مدلهای Camera، Flash، Lenz، Accessories و ... که همشون فیلدهای مشترکی دارند (که شما رو مجبور به Concat کردن!) رو تو یه مدل بنام Category قرار بدین و فقط نوعشون رو از یه جدول دیگه بگیرید و اگه تفاوت های زیادی تو مشخصات دارن (که حتماً اینطور هست!)، یه مدل ProductType داشته باشید که اونجا بشه فیلدهای متفاوت رو تعریف کرد و Product از اون ارث ببره و ...
____________________
بگذریم؛ خوب شما هم بطور ضمنی ViewModel درست کردین؛ اون var یه ViewModel بدون نوع هست که بعنوان ViewBag.Categorys دارید به View پاس میدین (یکی از var ها new نداره!)؛ همینکار رو میشه با یه کوئری linq بصورت مطمئن تر زیر انجام داد، ببینید این ViewModel جواب میده:
var categories =
(from category in Context.CatCamera
select new
{
category.Id,
category.catDetails,
category.category
})
.Concat(from category in Context.CatFlash
select new
{
category.Id,
category.catDetails,
category.category
})
.Concat(from category in Context.CatLenz
select new
{
category.Id,
category.catDetails,
category.category
})
.Concat(from category in Context.catAccessories
select new
{
category.Id,
category.catDetails,
category.category
});
ViewBag.Categories = categories;
اصولآً باید جواب بگیرید، مگه اینکه مشکلی تو View داشته باشید ...

gama_slv
شنبه 15 تیر 1392, 20:36 عصر
برای اینکه از اطلاعات چند جدول با هم استفاده کنی باید حتما یک ViewModel استفاده بشه.تاما فیلد هایی که میخواید استفاده کنید رو در یک ViewModel بگذارید و نا ویو مدلتون رو هم ViewModelنام مدل مثلا OrdersViewModel قرار بدید با این روش میتونید اطلاعاتی رو که میخواید نمایش داده بشه در ویو مشاهده کنید.

forestasphalt
یک شنبه 16 تیر 1392, 10:05 صبح
List<MenuCategoryModel> list = new List<MenuCategoryModel>();
var catCamera = Context.CatCamera.Select(p => new { p.Id, p.catDetails, p.category, Catname = "CatCameras" });
var catflash = from p in Context.CatFlash select new { p.Id, p.catDetails, p.category, Catname = "CatFlashes" };
var catLenz = Context.CatLenz.Select(p => new { p.Id, p.catDetails, p.category, Catname = "CatLenzs" });
var CatAccessories = Context.catAccessories.Select(p => new { p.Id, p.catDetails, p.category, Catname = "catAccessories" });
var concat = catflash.Concat(catCamera.Concat(catLenz.Concat(Ca tAccessories)));
foreach (var item in concat)
{
list.Add(new MenuCategoryModel() { Id = item.Id, Category = item.category, CatDetails = item.catDetails, Catname = item.Catname });

}
return View(list);

public class MenuCategoryModel
{
//tbl name
public string Catname { get; set; }

public Int32 Id { get; set; }
public string Category { get; set; }
public string CatDetails { get; set; }
public string Model { get; set; }


}


منم قبول دارم روش زیاد مناسبی نیست
من با این روش مشکلم حل شد
anonymous type رو نمیشه مستقیم در view استفاده کرد باتوجه به لینکی که آقای یونس دوست دادن،اون new توی کپی پیست کردن جا افتاده بود!
بله concat ها کلا با یک کوئری انجام بشه بهتره موافقم
مرسی از دوستان