我正在尝试查询(通过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”类的成员
答案 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查询按顺序应用于列表。 在您的情况下,订单是
PriceVarianceSubsetData
拍摄Prises
Prices
过滤ShortName
列表
... 因此您会收到错误。
正确的方法是首先过滤初始列表,然后选择所需的值。
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);