2017-10-06 12 views
0

誰もがこれを手助けできますか、LINQを使用して簡単なクエリを実行しようとしていますが、期待した結果が得られません。LINQクエリが期待どおりの結果を返さない

private void ButtonProductSearch_Click(object sender, EventArgs e) 
{ 
    string userSearch = textBoxSearchText.Text.ToLower(); 

    var productSearch = 
     from product in sales 
     where product.ToString().ToLower() == userSearch 
     select product; 

    MessageBox.Show(productSearch.Count().ToString()); //For Testing 

    sales.Clear(); 
    sales.AddRange(productSearch); 
    DisplaySales(sales); 
} 

テスト用のメッセージは0を返していますが、関連する検索文字列を入力しています。

salesはcsvファイルから作成されたSaleオブジェクトで、Saleオブジェクトからデータオブジェクトが読み込まれます(下のスクリーンショット)。番目のアプリケーションを実行すると、売上高はcsvファイルからすべての行を読み込み、DataGridViewのは、そのデータを移入し、

screenshot

+2

「セールス」とは何ですか? 'product.ToString()'は何を返しますか?メソッドの始めに 'sales'に要素がありますか? (単一の失敗した検索の後に 'sales'が空になります!) –

+1

文字列をトリムしようとします – Sajeetharan

+0

これは簡単にデバッグ可能です。あなたの問い合わせ行にブレークポイントを置き、 'userSearch'と' sales'の値をチェックしてください。これはおそらく、基礎となる店舗の空白文字の存在に関係しています。 – dotNET

答えて

2

下のスクリーンショットクエリfrom product in salesで、productはのを参照していることを理解する必要がありますsalesであり、Productという名前の列には適用されません。したがって、ToString()productにすると、その行の文字列表現(ほとんどの場合、クラス自体の名前)が返されます。 sは、売上高のを指し、したがって、あなたはそのためフィルタリングするためにLINQを頼むことができるなどの製品、価格と支払いの種類などのすべてのプロパティを持っている、再び

var productSearch = 
    from s in sales 
    where s.Product.ToLower() == userSearch 
    select product; 

ここ:あなたは、このようなクエリを記述する必要がありますProductプロパティがuserSearchに等しい行の場合Productは文字列型なので、ToString()を実行する必要はありません。

0

@dotNETからの回答は正しい答えと思われます。完全性のために、例を構築し、大文字と小文字を区別しない検索を実装しました:

using System; 
using System.Linq; 
using Bogus; 

public class Program 
{ 
    public static void Main() 
    { 
     var productsFactory = new Faker<Product>() 
      .StrictMode(true) 
      .RuleFor(p => p.TransactionDate, f => f.Date.Between(DateTime.UtcNow.AddDays(-100), DateTime.UtcNow)) 
      .RuleFor(p => p.Category, f => f.Commerce.ProductAdjective()) 
      .RuleFor(p => p.Price, f => f.Random.Decimal(10, 100)) 
      .RuleFor(p => p.PaymentType, f => f.PickRandomWithout(PaymentType.Unknown)) 
      .RuleFor(p => p.Name, f => f.Commerce.ProductName()) 
      .RuleFor(p => p.City, f => f.Address.City()) 
      .RuleFor(p => p.State, f => f.Address.State()) 
      .RuleFor(p => p.Country, f => f.Address.Country()); 

     var products = productsFactory.Generate(50); 
     var userSearch = products.Skip(3).First().Name.Substring(2, 3); 
     var productSearch = products.Where(product => product.Name.IndexOf(userSearch, StringComparison.CurrentCultureIgnoreCase) >= 0); 

     foreach (var result in productSearch) 
     { 
      Console.WriteLine(String.Format("{0:G} {1} {2:N2}", result.TransactionDate, result.Name, result.Price)); 
     } 

     Console.ReadKey(); 
    } 
} 

public class Product 
{ 
    public DateTime TransactionDate { get; set; } 
    public string Category { get; set; } 
    public decimal Price { get; set; } 
    public PaymentType PaymentType { get; set; } 
    public string Name { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Country { get; set; } 

} 

public enum PaymentType 
{ 
    Unknown, 
    Mastercard, 
    Visa, 
    Amex, 
} 
関連する問題