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

时间:2016-06-29 23:20:53

标签: c# linq class generics generic-list

我正在尝试查询(通过LINQ)一个通用列表,并且它“正在行动”,好像我“在哪里”的某些字段不存在。

以下是代码:

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'接受类型'string'的第一个参数可以找到(你是否缺少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;

为什么它对“价格”没有疑虑但却抱怨“ShortName”?他们都是“PriceVarianceSubsetData”类的成员

2 个答案:

答案 0 :(得分:5)

你遇到的问题是,一旦运行Select方法,你就会在字符串上进行迭代,只需将选择移到最后,它就能正常工作

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

我会尝试

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

答案 1 :(得分:3)

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

  1. PriceVarianceSubsetData拍摄Prises
  2. 列表
  3. Prices过滤ShortName列表 ...
  4. 因此您会收到错误。

    正确的方法是首先过滤初始列表,然后选择所需的值。

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

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

    Price是字符串,你想要加倍。您应该将字符串值解析为double。

    代码将是

    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);