我是System.Linq.Dynamic.Core的新手。我有这个:
假设我们有:
Packs = new List<Pack>
{
new Pack()
{
IdAtSource="Pack1",
Equipments= new List<Equipment>()
{
new Equipment
{
Id=1,
GenericEquipment = new GenericEquipment()
{
Id=7
}
}
}
},
new Pack()
{
IdAtSource="Pack2",
Equipments= new List<Equipment>()
{
new Equipment
{
Id=2,
GenericEquipment = new GenericEquipment()
{
Id=1
}
},
new Equipment
{
Id=2,
GenericEquipment = new GenericEquipment()
{
Id=2
}
}
}
}
}
我想选择带Equipments
的Packs
,但在所选Equipments
我只需要拥有Id=2
的通用设备包装(结果应包含一个带设备清单的包装清单)。
我已经试过了:
querable.Where("Packs.Equipments.Select((GenericEquipment.Id)=1)");
但我觉得我在这里没有目标。还有关于如何使用该库的文档页面吗?
非常感谢
动态LINQ的最新版本似乎是该项目在这里 ,与文档在这里 。
通常,相对于标准LINQ要求动态LINQ的唯一原因是在编译时不知道类型。
如果在编译时知道查询将针对List<Pack>
,则可以使用stanadard LINQ,如以下代码所示(请注意,这会修改Pack
的原始实例):
var usefulPacks = Packs.Select(pack => {
pack.Equipments = pack.Equipments.Where(equipment =>
equipment.GenericEquipment.Id == 1
).ToList();
}).Where(pack => pack.Equipments.Any()).ToList();
如果您需要不修改原始实例的代码,则此代码将创建原始实例的副本:
var usefulPacks = Packs.Select(pack => {
return new Pack() {
IDAtSource = pack.IDAtSource,
Equipments = pack.Equipments.Where(equipment =>
equipment.GenericEquipment.Id == 1
).ToList();
};
}).Where(pack => pack.Equipments.Any()).ToList();
请注意,这没有使用.SelectMany
— .SelectMany
用于从嵌套枚举创建单个枚举;这里最终列表中的每个Pack
对应于原始列表中的Pack
。
动态LINQ不支持在表达式中修改或初始化属性:
表达式语言允许获取(但不能设置)任何可到达的公共字段,属性或索引器的值。
因此,“ Equipments
属性无法更改/初始化为仅包含符合条件的“ Equipment
实例。
为了设置Equipments
,您有两个选择:
Pack
添加一个带有适当参数的构造函数 将构造函数添加到Pack
您可以使用适当的参数向Pack
添加一个构造函数,以设置Equipments
:
Pack(int IDAtSource, IEnumerable<Equipment> equipments) {
this.IDAtSource = IDAtSource;
this.Equipments = equipments.ToList();
}
然后,您可以使用以下命令:
IQueryable qry = Packs.AsQueryable();
qry = qry
.Select("Pack(IDAtSource, Equipments.Where(GenericEquipment.ID=1))")
.Where("Equipments.Any");
定义静态方法
public static class MyPackMethods {
public static Pack Create(int IDAtSource, IEnumerable<Equipment> equipments) {
return new Pack() {
IDAtSource = IDAtSource,
Equipments = equipments.ToList()
};
}
}
并致电:
IQueryable qry = Packs.AsQueryable();
qry = qry
.Select("MyPackMethods.Create(IDAtSource, Equipments.Where(GenericEquipment.ID=1))")
.Where("Equipments.Any");
这些应该工作:
var equipments= from pack in Packs where pack.Equipments.Any() select pack.Equipments;
var secondEquipments = from pac in equipments where
pac.GenericEquipment.Id == 2 select pac;
//I could use one variable instead of 2 but that would look a little bit complex
Msdn Link(很抱歉,我在移动电话上,所以我不能重命名它): https : //msdn.microsoft.com/zh-cn/library/bb397927.aspx