محمد کمائی - Telegram : @komayi
محمد کمائی - Telegram : @komayi
خواندن ۲ دقیقه·۳ سال پیش

نوشتن یک متد سرویس با خروجی از نوع لیستی از آبجکتها بدون نوشتن کلاس Dto

- وقتی در یک متد سرویس یک کوئری می نویسیم اگر فقط یک مقدار ساده برگردانیم مثل int یا string که مشکلی نیست و خروجی متدمون از همین نوع هاست.

- اگر بخوایم از دیتابیس یک کوئری بزنیم و نوع خروجی کوئری هم از نوع poco یا همون entity هامون هست نوع خروجی مون میشه مثلا

List<Member>

یا

IEnumerable<Member>

- ولی اگر بخوایم از دیتابیس یک کوئری بزنیم و نوع خروجی کوئری از نوع poco یا همون entity هامون نباشه (مثلا چند تنها دو فیلد از 10 فیلد یک جدول رو برگردونیم یا اینکه چند فیلد از یک جدول و چند فیلد از جدول دیگه دیتابیس که با هم جوین خوردن رو برگردونیم) دو راه داریم :

  1. ساختن یک کلاس Dto و قراردادن پراپرتی هایی از جنس خروجی کوئری مون در اون و استفاده اون در کوئری:
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 نیست.



کلاس dtocqueryreturn typelist
C# , .net core & angular & blazor , sql server
شاید از این پست‌ها خوشتان بیاید