- وقتی در یک متد سرویس یک کوئری می نویسیم اگر فقط یک مقدار ساده برگردانیم مثل int یا string که مشکلی نیست و خروجی متدمون از همین نوع هاست.
- اگر بخوایم از دیتابیس یک کوئری بزنیم و نوع خروجی کوئری هم از نوع poco یا همون entity هامون هست نوع خروجی مون میشه مثلا
List<Member>
یا
IEnumerable<Member>
- ولی اگر بخوایم از دیتابیس یک کوئری بزنیم و نوع خروجی کوئری از نوع poco یا همون entity هامون نباشه (مثلا چند تنها دو فیلد از 10 فیلد یک جدول رو برگردونیم یا اینکه چند فیلد از یک جدول و چند فیلد از جدول دیگه دیتابیس که با هم جوین خوردن رو برگردونیم) دو راه داریم :
public IEnumerable<MemberDto> GetMembers() { var members = db.Members .Select(m => new MemberDto { Id = m.MemberId, FullName = m.FullName }) .ToList(); return members; }
2. اما اگر بعد از کلمه کلیدی new اسم یک کلاس Dto مون رو نیاریم کامپایلر سی شارپ یک آبجکت بی نام (anonymous object) برامون میسازه و از آنجایی که همه آبجکت ها در سی شارپ از object ارث بری میکنن میشه خروجی متد رو IEnumerable ای از object گذاشت:
public IEnumerable<object> GetMembers() { var members = db.Members .Select(m => new { Id = m.MemberId, FullName = m.FullName }) .ToList(); return members; }
بدین ترتیب میتونید کلاس Dto رو نساخت و جلوی new هم اسم کلاسی رو نیاورد.
نکته : آبجکتهای anonymous object فقط خواندنی هستند (read only) و اگر نیاز بشه که روی لیست members یه foreach بزنید و یکی از فیلدها رو تغییر بدین ارور میگیرین و در این مواقع مجبورید کلاس Dto رو بسازید ، ولی در اکثر مواقع که کوئری از دیتابیس زده میشه و جوابش بدون تغییر به کلاس کنترلر return میشه با این روش نیازی به نوشتن کلاس Dto نیست.