簡體   English   中英

使用Lambda表達式在Entity Framework中的兩個列表中找到匹配項

[英]FInd matching item in two lists in Entity Framework using Lambda expressions

我正在嘗試建立一個過濾系統。 假設您有這些模型。

public class FilterVM
{
    public string ContentRating { get; set; }
    public List<FilterChars> FilterChars { get; set; }
    public List<FilterCats> FilterCats { get; set; }
    public List<FilterTags> FilterTags { get; set; }
}
public class FilterChars
{
    public int CharID { get; set; }
    public int CharVal { get; set; }
}

public class Book
{
    public int BookID { get; set; }
    public ICollection<BookCharacteristic> BookCharacteristic { get; set; }
}
public class BookCharacteristic
{
    public int ID { get; set; }
    public int BookID { get; set; }
    public int CharacteristicID { get; set; }
    public Book Book { get; set; }
    public int Value { get; set; }
    public Characteristic Characteristic { get; set; }
}

這樣就發布了一個表單,並且有一個FilterVM和一個FilterChars列表,現在我需要查找具有特征( CharID )且值大於提交值的書。

這是我正在嘗試的方法,但是我無法找出編寫查詢的正確方法。

 List<FilterChars> fc = new List<FilterChars>();
        foreach (var filter in f.FilterChars.Where(x => x.CharVal > 0)) {
            fc.Add(filter);
        }
 var books = db.Books
      .Where(t => fc.Select(y => y.CharID)
      .Contains(t.BookCharacteristic
            .Any(u => u.CharacteristicID)
      )
      && //if there's a match, use the matched BookCharacteristic and Value?? 
         //not sure how to do that
 );
    public class BookCharacteristicEqualityComparer : IEqualityComparer<BookCharacteristic>
    {
        public bool Equals(BookCharacteristic x, BookCharacteristic y)
        {
            return x.CharacteristicID == y.CharacteristicID && x.Value == y.Value;
        }

        public int GetHashCode(BookCharacteristic obj)
        {
            return obj.CharacteristicID * obj.Value;
        }
    }

那是為了比較BookCharacteristics與id和value

    var books = db.Books
        .Where((book) =>
        {
            foreach (var filterChar in fc)
            {
                if (!book.BookCharacteristic.Contains(new BookCharacteristic() {CharacteristicID = filterChar.CharID, Value = filterChar.CharVal},
                                                        new BookCharacteristicEqualityComparer()))
                    return false;
            }

            return true;
        });

從過濾器中查找包含所有特征和值的所有書籍

希望有幫助:)

編輯:這是我的代碼,可以編譯並正常運行(我沒有結果,因為我沒有數據,但是沒有錯誤)

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        var fc = new List<FilterChars>();
        var dbBooks = new List<Book>();

        var books = dbBooks
        .Where((book) =>
        {
        foreach (var filterChar in fc)
        {
            if (!book.BookCharacteristic.Contains(new BookCharacteristic() { CharacteristicID = filterChar.CharID, Value = filterChar.CharVal },
                                                    new BookCharacteristicEqualityComparer()))
                return false;
        }

        return true;
        });
    }


}

public class FilterVM
{
    public string ContentRating { get; set; }
    public List<FilterChars> FilterChars { get; set; }
}
public class FilterChars
{
    public int CharID { get; set; }
    public int CharVal { get; set; }
}

public class Book
{
    public int BookID { get; set; }
    public ICollection<BookCharacteristic> BookCharacteristic { get; set; }
}
public class BookCharacteristic
{
    public int ID { get; set; }
    public int BookID { get; set; }
    public int CharacteristicID { get; set; }
    public Book Book { get; set; }
    public int Value { get; set; }
}

public class BookCharacteristicEqualityComparer : IEqualityComparer<BookCharacteristic>
{
    public bool Equals(BookCharacteristic x, BookCharacteristic y)
    {
        return x.CharacteristicID == y.CharacteristicID && x.Value == y.Value;
    }

    public int GetHashCode(BookCharacteristic obj)
    {
        return obj.CharacteristicID * obj.Value;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM