استفاده از Distinct برای List توسط Entity Framework در C#
سلام بنده دو جدول دارم که فیلدهای اونها به صورت زیر هستن :
جدول مشتری
public class customer
{
public int customerId {get; set;}
public string customerName {get; set;}
}
جدول خریدهای مشتری (به صورت خیلی خلاصه)
public class order
{
public int orderId {get; set;}
public int customerId {get; set;}
public dateTime orderDate {get; set;}
}
اطلاعات موجود در جدول order :

خب در جدول order ممکنه یک مشتری چندین بار سفارش داشته باشه. حالا من میخوام لیست مشتریانی که سفارش دارن رو نمایش بدم. یعنی اگر در تصویر بالا نگاه کنید مشتریهای 3 و 5 باید نمایش داده بشه. از کویری زیر استفاده کردم :
var query = _context.order.Distinct.ToList();
ولی در خروجی هر 5 رکورد نمایش داده میشه. چجوری میتونم لیست مشتریانی که خرید داشتن رو پیدا کنم ؟
پاسخ هوش مصنوعی
برای نمایش لیست مشتریانی که حداقل یک سفارش دارند، شما باید از ترکیب `GroupBy` و `Select` استفاده کنید، به طوری که مشتریانی را که دارای سفارش هستند، استخراج کنید. با توجه به کلاس های شما، کد زیر می تواند به شما کمک کند:
var customerWithOrders = _context.orders
.Select(o => o.customerId) // انتخاب customerId از جدول سفارشات
.Distinct() // انتخاب مقادیر منحصر به فرد
.ToList(); // تبدیل به لیست
سپس می توانید این لیست از `customerId`ها را برای بازگرداندن اطلاعات کامل مشتریان با استفاده از جستجو در جدول مشتریان (customer) استفاده کنید:
var customers = _context.customers
.Where(c => customerWithOrders.Contains(c.customerId)) // بررسی اگر customerId در لیست مشتریان باشد
.ToList(); // تبدیل به لیست
در اینجا `customers` شامل فقط مشتریانی است که حداقل یک سفارش دارند.
سلام
Distinct براساس ستون مشخصی عمل میکنه. به عبارت دیگه شما برای Distinct مشخص نکردی براساس کدوم ستون عمل کنه و تکراری ها رو شمارش نکنه. شما یا باید برای این دستور نام ستون موردنظرت رو بگی و یا حتی شما میتونی یه select براساس costomerid بزنی و بعد روی نتیجه این select دستورDistinct رو اجرا کنی.
حذف رکوردهای تکراری توسط دستور Distinct
برای استفاده از دستور Distinct در انتیتی فریم ورک یا باید بر اساس یک ستون این کار رو انجام بدید یا اینکه اگر بر اساس کل سطرها (بر اساس انتیتی) می خواید این کار انجام بشه باید سطرها دارای اطلاعات تکراری باشن.
الان در تصویری که شما از اطلاعات خودتون ارسال کردید درسته که customerId ها تکراری هستن ولی orderDate ها یکسان نیستن.
استفاده از دستور Distinct در سی شارپ بر اساس یک ستون مشخص
دستور شما به صورت زیر باید تبدیل بشه :
var model = _Context.orders.Select(s => s.customerId).Distinct().ToList();
با اجرا کوئری بالا شما فقط customerId هایی که تکراری نیستن رو خواهید داشت.

دقت کنید اگر بر اساس بیش از یک ستون هم خواستید اطلاعات رو داشته باشید می تونید به صورت زیر انجام بدید.(فرض کنید در خدول order ستون CustomerName و CustomerTel هم دارید.
var model = _Context.orders.Select(s => new {customerId = s.customerId , customerName = s.customerName, customeTel = s.customerTel}).Distinct().ToList();
- جلوگیری از اد شدن خودکار در گروه و کانال تلگرام
- کم کردن حجم فیلم توسط کد در Asp net core
- چه کسانی استوری تلگرام را می بینند ؟
- برای کسب و کار تلگرام پرمیوم بهتره یا واتس اپ بیزینس ؟
- جلوگیری از انتشار غیرمجاز مطالب در کانال های تلگرامی
- تفاوت های تلگرام و واتس اپ چیست ؟
- چرا استوری های واتس اپ برای دوستان نمایش داده نمیشن ؟
- چند تا استوری رایگان می تونیم تلگرام بذاریم ؟
- خطای Severity Code Description Project هنگام استارت پروژه
- کار نکردن navBar و sideBar در پروژه Asp.net core
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- رفع خطا در مایگریشن - Specify ON DELETE NO ACTION or ON UPDATE NO ACTION
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress