2017-10-06 125 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是Sale對象,它是從csv文件填充的,並且存在一個從Sale對象填充的dataGridView,屏幕截圖如下。當運行個應用,銷售讀取來自CSV每一行,並datagridview的與數據填充,下面的截圖

screenshot

+2

什麼是「銷售」? 'product.ToString()'返回什麼?在方法開始時,「銷售」中是否還有任何元素? (在搜索失敗後'銷售'將被清空!) –

+1

嘗試修整字符串 – Sajeetharan

+0

這應該很容易調試。在查詢行放置一個斷點並檢查'userSearch'和'sales'的值。這可能與底層商店中存在空白字符有關。 – dotNET

回答

2

你需要明白的是,在查詢from product in salesproduct指的sales而不是名爲Product的列。因此,在product上執行ToString()將返回該行的字符串表示形式(這通常是該類本身的名稱)。你應該寫這樣的查詢:

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

在這裏,s是指銷售的行,因此得到了類似的產品,價格和付款方式等所有的屬性,因此你可以問LINQ過濾對於其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, 
}