为什么我的 LINQ 查询无法识别通用列表的成员?

Why is my LINQ query not recognizing members of a generic list?

我正在尝试查询(通过 LINQ)通用列表,它 "acting" 就好像我 "whereing on" 的某些字段不存在一样。

代码如下:

private decimal GetPriceForMember_Code_Desc_Unit_Week(string member, string itemcode, string desc, string unit, int weeknum)
{
    Decimal price = 0.00M;
    if (unit == CRAFTWORKS_SC)
    {
        price = craftworksWeek1PVDSubsetList.Select(x => x.Price)
            .Where(x => x.ShortName.Equals(member))
            .Where(x => x.Description.Equals(desc))
            .Where(x => x.WeekNum.Equals(weeknum))
            .Where(x => x.ItemCode.Equals(itemcode));
    }
    //else if (unit == CHOPHOUSE) TODO: Finish
    return price;
}

它失败了,“'string' 不包含 'ShortName' 的定义并且没有扩展方法 'ShortName' 接受类型为 [=29= 的第一个参数] 可以找到(您是否缺少 using 指令或程序集引用?)"

我的 LINQ 语法显然有问题,但我不知道是什么。代码中的通用列表是这样定义和声明的:

public class PriceVarianceSubsetData
{
    public String ShortName { get; set; }
    public String ItemCode { get; set; }
    public String Description { get; set; } //<= need this, too?
    public String Price { get; set; }
    public int WeekNum { get; set; }
}
. . .
List<PriceVarianceSubsetData> craftworksWeek1PVDSubsetList = null;

为什么对"Price"无怨无悔却对"ShortName"抱怨?他们都是class"PriceVarianceSubsetData"

的成员

Linq 查询按顺序应用于列表。 在您的情况下,顺序是

  1. PriceVarianceSubsetData 的列表中取出 Prises
  2. ShortName 筛选 Prices 的列表 ...

结果你得到一个错误。

正确的方法是先筛选初始列表,然后select您需要的值。

craftworksWeek1PVDSubsetList.Where(...).Select();

同样在这种情况下,您将获得满足您条件的所有价格列表 (IEnumerable<string>)。使用 Single() 方法只能取一个值。方法的选择取决于所需的行为。您应该 select 来自 Single/First/SingleOrDefault/FirstOrDefault 方法。

Price 是字符串,你想要双精度。您应该将字符串值解析为双精度值。

代码将是

string stringPrice = craftworksWeek1PVDSubsetList
        .Where(x => x.ShortName.Equals(member))
        .Where(x => x.Description.Equals(desc))
        .Where(x => x.WeekNum.Equals(weeknum))
        .Where(x => x.ItemCode.Equals(itemcode))
        .Select(x => x.Price)
        .Single();
price = Double.Parse(stringPrice);

你面临的问题是,一旦Select方法运行,你正在迭代字符串,只需将select移到最后,它就会起作用

您还创建了许多不必要的迭代器,每个 Linq 方法 returns 一个迭代器

我会试试

price = craftworksWeek1PVDSubsetList
        .Where(x => x.ShortName.Equals(member) &&
                    x.Description.Equals(desc) &&
                    x.WeekNum.Equals(weeknum) &&
                    x.ItemCode.Equals(itemcode))
         .Select(x => x.Price);