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的与数据填充,下面的截图
答
你需要明白的是,在查询from product in sales
,product
指的行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,
}
什么是“销售”? 'product.ToString()'返回什么?在方法开始时,“销售”中是否还有任何元素? (在搜索失败后'销售'将被清空!) –
尝试修整字符串 – Sajeetharan
这应该很容易调试。在查询行放置一个断点并检查'userSearch'和'sales'的值。这可能与底层商店中存在空白字符有关。 – dotNET