LINQ查询没有返回预期的结果

问题描述:

任何人都可以帮助这一点,我试图执行一个简单的查询使用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

你需要明白的是,在查询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()

我认为@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, 
}