جستجو Contains روی کلید های ترکیبی
وضعیت: پاسخ داده شده

اگر یک لیست رشته ایی داشته باشیم به راحتی میتونیم روی پایگاه داده جستجو کنیم:

var eyeColors = new List<string>
{
    "Black", "Green", "Brown"
};
var specificUsers = _context.Users.Where(x => eyeColors.Contains(x.EyeColor)).ToList();

حالا اگه لیست ما ترکیبی باشه این سرچ باید به چه صورت انجام بشه:

public class User
{
    public string FullName { get; set; }

    public string EyeColor { get; set; }
}
var customUsers = new List<User>
{
    new User{FullName = "Ali Ahmadi", EyeColor = "Brown"},
    new User{FullName = "Milad Rezaei", EyeColor = "Green"}
};

var specificUsers = _context.Users.Where(x => customUsers.Contains(new User(){EyeColor = x.EyeColor, FullName = x.FullName})).ToList();

روش فوق و روش های زیادی رو سرچ کردم ولی به جواب نرسیدم. آیا میشه از EF استفاده کرد یا راه حل دیگری دارد ؟

  • #
    ‫۲۲ روز قبل، سه‌شنبه ۶ شهریور ۱۴۰۳، ساعت ۱۹:۵۷
    • هدف شما در اصل یافتن یک یا چند «شیء مشخص»، در یک جدول بانک اطلاعاتی است. اگر از EF استفاده می‌کنید، هر رکورد/شیء شما، قطعا یک Id منحصربفرد هم دارد (تا یک «شیء مشخص» را تشکیل دهد). فقط بر اساس این Id کوئری بگیرید (نه بر اساس لیست تمام ستون‌های موجود). نتیجه‌ی کار، شبیه به کوئری اولی می‌شود که نوشتید (که البته اینجا، List آن از نوع int است و یا کلا نوع Pk جدول کاربران) و فوق العاده هم سریع است.
    • اگر Idهای اشیاء موجود در لیست فوق را ندارید، باید از PredicateBuilder استفاده کنید تا بتوانید کوئری‌های Or پویایی را به ازای هر شیء، تولید کنید. الان این PredicateBuilder، جزئی از کتابخانه‌ی Gridify هم هست.

    var predicate = PredicateBuilder.False<User>();
    
    foreach(var user in customUsers)
    {
       predicate = predicate.Or(u => u.FullName == user.FullName && 
                                     u.EyeColor == user.EyeColor);
    }
    
    var specificUsers = _context.Users.Where(predicate).ToList();
  • #
    ‫۲۲ روز قبل، چهارشنبه ۷ شهریور ۱۴۰۳، ساعت ۱۴:۳۳
    var customUsers = new List<User>
    {
        new User{FullName = "Ali Ahmadi", EyeColor = "Brown"},
        new User{FullName = "Milad Rezaei", EyeColor = "Green"}
    };
    var specificUsers = _context.Users.Where(x => customUsers.Any(xx=> xx.EyeColor == x.EyeColor || xx.FullName == x.FullName)).ToList();

    آیا روش بالا به حل مسئله شما کمک میکنه؟ البته بجای اپراتور == میتوانید از متد Contains هم استفاده کنید که در نهایت به Is Exists در Sql Server ترجمه خواهد شد.

    • #
      ‫۲۲ روز قبل، چهارشنبه ۷ شهریور ۱۴۰۳، ساعت ۱۶:۵۸

      خیر؛ چون customUsers یک لیست از کلاس ساخته شده توسط خودمه (اگه لیست از جنس int، string و ... رو داشته باشم این مشکل نیست)به خاطر همین اکسپشن میده و میگه نمیتونم Linq رو ترجمه کنم.