在linq搜索中过滤掉空值

时间:2012-12-03 17:33:05

标签: database linq linq-to-sql

我正在建立一个处理书籍和期刊的图书馆。 我有一个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的值。这样,我的搜索总是空出来的:( 我不知道如何继续。我会喜欢一些帮助。

谢谢!

2 个答案:

答案 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();