شما میتونیداز Automapper کمک بگیرید
ابتدا ویومدلتون را اصلاح کنید چون شما می خواهید رشته ها را با کاما بهم بچسبانید باید فیلد از نوع رشته تعریف کنید
public class ShopViewModel
{
public string ShopName { get; set; }
public string Categories { get; set; }
}
چون ef از توابع سی شارپ در بدنه خود پشتیبانی نمی کند باید از automapper بهره بریم
لیست زیر به راحتی اون چیزی را که میخواین بهتون میده
var li= _mapper.Map<List<ShopViewModel>>(Shops.Include(x=> x.ShopCategories));
کلاس کانفیگ autommaper هم یادتون نره
configuration.CreateMap<shop, ShopViewModel>()
.ForMember(dest => dest.ShopName , opt => opt.MapFrom(src => src.ShopName ))
.ForMember(dest => dest.Categories , mo => mo.MapFrom(src =>
src.ShopCategories!= null
? string.Join(",", src.ShopCategories.Select(x => x.CatName).ToList())
: ""));
اگر از Automapper نمی خواید استفاده کنید باید ابتدا لیست زیر واکشی کنید
var list=Shops.Include(x=> x.ShopCategories).tolist();
var return=list.select(x=> new ShopViewModel{ShopName =x.shopname,
Categories =
string.Join(",", src.ShopCategories.Select(x => x.CatName)
و سپش projection بزنید که این روش سربار داره و کند تر هست به دلیل اینکه یکبار داده از دیتابیس خوانده شده و سپس حلقه یا select مجدد روی آن اجرا میشود