2012-12-03 94 views
-1

我正在建立一個處理書籍和期刊的書庫。 我有一個winform,用戶輸入一些參數來搜索庫DB。我不知道他選擇插入哪個值。在linq搜索中過濾空值

例如:

public abstract class Item : IComparer, IEnumerable 
{ 
    public string Name { get; set; } 
    public string Publisher { get; set; } 
    public double Price { get; set; } 
    public double Discount { get; set; } 
    public DateTime ReleaseDate { get; set; } 
} 

這是我的基類。當用戶可以插入到按名稱搜索(這轉換成書名)。 用戶界面有許多選項可供搜索,並且基本上包括書中包含的幾乎所有字段。

我需要做的只是過濾掉用戶插入的字段,將它們傳遞給我的DAL,以便他可以在ENTITY框架映射數據庫上使用LINQ查詢執行搜索。

這是我搜索迄今:

public List<Books> SelectBookFromDB(Item itemType) 
{ 
    BookVO book = itemType as BookVO; 
    var result = myEntities.Books.Where(x => 
             x.Author == book.Author && 
             x.Discount == book.Discount && 
             x.Name == book.Name && 
             x.Publisher == book.Publisher).ToList();    
    return result; 
} 

問題是,即時通訊尋找一些值可能爲空。這樣一來,我的搜索總是能想出空:( 我不知道如何進行會喜歡一些幫助

感謝

回答

2

使用一個以上的步驟生成查詢:!

var result = myEntities.Books; 

if(string.IsNullOrWhiteSpace(book.Author) == false) 
{ 
    result = result.Where(x => x.Author == book.Author); 
} 

if(string.IsNullOrWhiteSpace(book.Name) == false) 
{ 
    result = result.Where(x => x.Name == book.Name); 
} 

...And so on. 

return result; 
0

改變項目類,使每一個類型是正確的可空:

public abstract class Item : IComparer, IEnumerable 
{ 
    public string Name { get; set; } 
    public string Publisher { get; set; } 
    public double? Price { get; set; } 
    public double? Discount { get; set; } 
    public DateTime? ReleaseDate { get; set; } 
} 

這允許每個屬性時,它有一個值,當我清楚地劃分t不。如果有人想要搜索所有正常價格的書籍(意味着折扣== 0)會怎麼樣?

然後,您可以空檢查只需添加到您的結果查詢:

var result = myEntities.Books.Where(x => 
    (book.Author == null || x.Author == book.Author) && 
    (book.Discount == null || x.Discount == book.Discount) && 
    (book.Name == null || x.Name == book.Name) && 
    (book.Publisher == null || x.Publisher == book.Publisher)).ToList();