为什么我的 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 查询按顺序应用于列表。
在您的情况下,顺序是
- 从
PriceVarianceSubsetData
的列表中取出 Prises
- 按
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);
我正在尝试查询(通过 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 查询按顺序应用于列表。 在您的情况下,顺序是
- 从
PriceVarianceSubsetData
的列表中取出Prises
- 按
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);