-1

我正在建立一个处理书籍和期刊的图书馆。我有一个 winform,用户可以在其中输入一些参数以在库数据库上进行搜索。我不知道他选择插入哪个值。

例如:

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; }
}

这是我的基类。当用户可以插入按名称搜索时(翻译成书名)。UI 有许多可供搜索的选项,并且基本上包括一本书包含的几乎所有字段。

我需要做的是只过滤掉用户插入的字段,将它们传递给我的 DAL,以便他可以使用 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;
}

问题是,我正在搜索一些可能为空的值。这样,我的搜索总是空的:(我不知道如何继续。希望得到一些帮助。

谢谢!

4

2 回答 2

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;
于 2012-12-03T17:38:08.123 回答
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(); 
于 2012-12-03T17:52:57.637 回答