Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ查询未返回预期结果_C#_Linq - Fatal编程技术网

C# LINQ查询未返回预期结果

C# LINQ查询未返回预期结果,c#,linq,C#,Linq,有人能帮我吗?我正在尝试使用LINQ执行一个简单的查询,但没有得到预期的结果 private void ButtonProductSearch_Click(object sender, EventArgs e) { string userSearch = textBoxSearchText.Text.ToLower(); var productSearch = from product in sales where product.ToStrin

有人能帮我吗?我正在尝试使用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文件填充,还有一个dataGridView,由Sale对象填充,屏幕截图如下。当应用程序运行时,sales读取csv中的每一行,datagridview将填充该数据,屏幕截图如下


您需要了解,在来自销售中的产品的查询中,
产品是指销售中的
行,而不是名为
产品的列。因此,在
product
上执行
ToString()
将返回该行的字符串表示形式(通常是类本身的名称)。您应该这样编写查询:

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

这里再次说明,
s
指的是销售的行,因此具有产品、价格和付款类型等所有属性。因此,您可以要求LINQ筛选其
产品
属性等于
用户搜索
的行。由于
Product
是string类型,您甚至不需要对其执行
ToString()

您需要了解,在来自销售中的产品的
查询中,
Product
指的是
sales
行,而不是名为
Product
的列。因此,在
product
上执行
ToString()
将返回该行的字符串表示形式(通常是类本身的名称)。您应该这样编写查询:

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

这里再次说明,
s
指的是销售的行,因此具有产品、价格和付款类型等所有属性。因此,您可以要求LINQ筛选其
产品
属性等于
用户搜索
的行。由于
Product
是string类型,您甚至不需要对其执行
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,
}
使用系统;
使用System.Linq;
使用伪造文件;
公共课程
{
公共静态void Main()
{
var productsFactory=新的伪造者()
.StrictMode(真)
.RuleFor(p=>p.TransactionDate,f=>f.Date.Between(DateTime.UtcNow.AddDays(-100),DateTime.UtcNow))
.RuleFor(p=>p.Category,f=>f.Commerce.product形容词())
.RuleFor(p=>p.Price,f=>f.Random.Decimal(10100))
.RuleFor(p=>p.PaymentType,f=>f.RuleFor(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(productSearch中的var结果)
{
WriteLine(String.Format(“{0:G}{1}{2:N2}”、result.TransactionDate、result.Name、result.Price));
}
Console.ReadKey();
}
}
公共类产品
{
公共日期时间事务日期{get;set;}
公共字符串类别{get;set;}
公共十进制价格{get;set;}
公共PaymentType PaymentType{get;set;}
公共字符串名称{get;set;}
公共字符串City{get;set;}
公共字符串状态{get;set;}
公共字符串国家{get;set;}
}
公共枚举付款类型
{
不详,
万事达卡,
签证
美国运股票交易所,
}

我认为@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,
}
使用系统;
使用System.Linq;
使用伪造文件;
公共课程
{
公共静态void Main()
{
var productsFactory=新的伪造者()
.StrictMode(真)
.RuleFor(p=>p.TransactionDate,f=>f.Date.Between(DateTime.UtcNow.AddDays(-100),DateTime.UtcNow))
.RuleFor(p=>p.Category,f=>f.Commerce.product形容词())
.RuleFor(p=>p.Price,f=>f.Random.Decimal(10100))
.RuleFor(p=>p.PaymentType,f=>f.RuleFor(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(productSearch中的var结果)
{
WriteLine(String.Format(“{0:G}{1}{2:N2}”、result.TransactionDate、result.Name、result.Price));
}
Console.ReadKey();
}
}
公共类产品
{
公共日期时间事务日期{get;set;}
公共字符串类别{get;set;}
公共十进制价格{get;set;}
公共PaymentType PaymentType{get;set;}
公共字符串名称{get;set;}
公共字符串City{get;set;}
公共字符串状态{get;set;}
公共字符串国家{get;set;}
}
公共枚举付款类型
{
不详,
万事达卡,
签证
美国运股票交易所,
}

什么是
销售
product.ToString()
返回什么?这里面有什么元素吗<