我正在建立一个处理书籍和期刊的图书馆。 我有一个winform,用户输入一些参数来搜索库DB。我不知道他选择插入哪个值。
例如:
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;
}
问题是,我正在搜索一些可能为null的值。这样,我的搜索总是空出来的:( 我不知道如何继续。我会喜欢一些帮助。
谢谢!
答案 0 :(得分: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;
答案 1 :(得分:0)
更改您的Item类,以便每种类型都可以正常为空:
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; }
}
这允许每个属性在有值时明确划分,何时不明确划分。如果有人想搜索所有正常价格的书籍(意味着折扣== 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();