فرض کنید یک جدول داریم به نام CriticalAlarms که لیستی از لاگهای سیستمی را ذخیره میکند و کاربران ادمین این لیست رو مشاهده میکنن ، اگر هر یوزری یکی از این رکوردهای لاگ یا آلارم رو مشاهده کرد باید در جدول دیگری به نام CriticalAlarmViews که جدول دیتیل تیبل اولی است یک رکورد بزنیم که بگیم این یوزر این آلارم رو مشاهده کرده و بعدا دوباره بهش اون آلارم رو نشون ندیم. در واقع میخوایم معادل t-sql دستور not exists رو بنویسم.
تفاوت exists و in در sql server این است که وقتی از in استفاده کنید تمامی اعضای داخل پرانتز in پیمایش میشن ولی اگر از exists استفاده کنید به محض اینکه شرط یا شرطهای داخل پرانتر exists برقرار شد مقدار true برگشت داده میشه و تا انتهای اعضا پیمایش نمیشه. معادل in در ef میشه Contains و معادل exists در ef میشه Any.
حالا میخوایم با EF Core لیستی از آلارم ها یعنی جدول مستر رو از دیتابیس واکشی کنیم که در جدول دیتیل رکورد نداشته باشن: (آلارمهای مشاهده نشده)
await appDbContext.CriticalAlarms .Where(a => !a.CriticalAlarmViews.Any(v => v.CriticalAlarmId == a.Id)) .ToListAsync();
https://stackoverflow.com/a/71108419/9875486