1

フィルタリングシステムを構築しようとしています。これらのモデルがあるとします。

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
 );
4

1 に答える 1

1
    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;
    }
}
于 2013-04-17T06:14:16.747 に答える