-1

本と雑誌を扱う本のライブラリを構築しています。ユーザーがライブラリDBで検索するためにいくつかのパラメーターを入力する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に渡して、ENTITYフレームワークにマップされたDBで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である可能性のあるいくつかの値を検索していることです。そうすれば、私の検索は常に空になります:(どのように進めるかわかりません。助けが必要です。

ありがとう!

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

すべてのタイプが適切にnull許容になるように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を意味する)であるすべての本を検索したい場合はどうなりますか?

次に、結果クエリにnullチェックを追加するだけです。

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 に答える