![](/img/trans.png)
[英]Using Include in Entity Framework 4 with lambda expressions
[英]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.