C# 数据表上的LINQ查询-拉取多列错误

C# 数据表上的LINQ查询-拉取多列错误,c#,.net,linq,C#,.net,Linq,我有一个包含3列的数据表: 产品、价格、制造商 我正在尝试将数据读入对象列表,定义以下项存储哪些行: 储存所有价格最便宜的产品,并采取 那条生产线的制造商 乙二醇- 列表中的预期输出是两个具有以下属性的对象: table, 12.50, woodpty chair, 9.00, woodpty 我有以下代码,但我得到一个错误- 字符串不包含“Name”的定义,也不包含扩展名 接受类型为“string”的第一个参数的方法“Name”可以是 找到(是否缺少程序集引用?) var结果=( 来自dtP

我有一个包含3列的数据表:

产品、价格、制造商

我正在尝试将数据读入对象列表,定义以下项存储哪些行:

储存所有价格最便宜的产品,并采取 那条生产线的制造商

乙二醇-

列表中的预期输出是两个具有以下属性的对象:

table, 12.50, woodpty
chair, 9.00, woodpty
我有以下代码,但我得到一个错误-

字符串不包含“Name”的定义,也不包含扩展名 接受类型为“string”的第一个参数的方法“Name”可以是 找到(是否缺少程序集引用?)

var结果=(
来自dtProductListings.AsEnumerable()中的行
按行将字段(“产品”)分组为g
设x=new
{
Name=g.Key.Name,//这一行导致了问题
价格=g.Min(x=>x.Field(“价格”))
}
其中(row.Name==x.Name&&row.Price==x.Price)
选择新Foo
{
Name=row.Name,
制造商=世界其他地区。制造商,
价格=行。价格
}
).ToList();
我对LINQ还是一个新手,我想知道我哪里做错了?任何帮助都将不胜感激。

试试以下方法:

var result = (
    from row in dtProductListings.AsEnumerable()
    group row by row.Field<string>("Product") into g
    select new
    {
        Name = g.Key,
        Price = g.Min(x => x.Field<float>("Price"))
        Manufacturer = g.First().Field<string>("Manufacturer")
    } 
).ToList();
var结果=(
来自dtProductListings.AsEnumerable()中的行
按行将字段(“产品”)分组为g
选择新的
{
名称=g.键,
价格=g.Min(x=>x.Field(“价格”))
制造商=g.First().字段(“制造商”)
} 
).ToList();

很好的尝试,但您的尝试存在一些问题。首先,您使用的
Name=g.Key.Name
应该是
Name=g.Key
,其次,您的Linq表达式也将无法编译,因为
在group by子句之后不再在范围内

Linq可能是一件棘手的事情,要想在一开始就弄清楚,但实际上,您要实现的是按产品列对行进行分组,然后在每组中选择价格最低的行

因此,要创建产品组:

var rowsGroups = from row in dtProductListings.AsEnumerable()
                 group row by row.Field<string>("Product") into g
                 select g.OrderBy(row => row.Price);
使用lambda表达式和linq链方法的同一查询(我发现这更容易编写,因为它将重点放在您所做工作的输入和输出上):

var result=dtProductListings.AsEnumerable()
.GroupBy(行=>行字段(“产品”))
.选择(x=>x.OrderBy(y=>y.Price))
.Select(x=>x.First())
.ToList();
进一步简化:

var result = dtProductListings.AsEnumerable()
            .GroupBy(row => row.Field<string>("Product"))
            .Select(x => x.OrderBy(y => y.Price).First())
            .ToList();
var result=dtProductListings.AsEnumerable()
.GroupBy(行=>行字段(“产品”))
.Select(x=>x.OrderBy(y=>y.Price).First()
.ToList();

我想你只需要
Name=g.Key
。我也这么想,但是我现在遇到了一个错误“WHERE子句的当前上下文中不存在名称“row”。LINQ一开始就是个棘手的问题。。非常感谢你对我的错误进行了深入的解释。LINQ链方法中的Lambda表达式似乎更易于阅读和使用。回答得很好!
var rowsGroups = from row in dtProductListings.AsEnumerable()
                 group row by row.Field<string>("Product") into g
                 select g.OrderBy(row => row.Price);
var result = (from row in rowGroups
             select row.First())
             .ToList();
var result = dtProductListings.AsEnumerable()
            .GroupBy(row => row.Field<string>("Product"))
            .Select(x => x.OrderBy(y => y.Price))
            .Select(x => x.First())
            .ToList();
var result = dtProductListings.AsEnumerable()
            .GroupBy(row => row.Field<string>("Product"))
            .Select(x => x.OrderBy(y => y.Price).First())
            .ToList();