Я новичок в 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
}
}
}
}
}
Я хотел бы выбрать Packs
с Equipments
, но в выбранном Equipments
мне нужно иметь только один Id=2
с Id=2
для общего оборудования (результат должен содержать список пакетов со списком оборудования).
Я пробовал это:
querable.Where("Packs.Equipments.Select((GenericEquipment.Id)=1)");
но я чувствую, что я нахожусь здесь цели. Также есть ли страница документации о том, как использовать эту библиотеку?
большое спасибо
Самая последняя версия Dynamic LINQ, похоже, является проектом здесь , с документацией здесь .
Как правило, единственная причина, по которой вам требуется Dynamic LINQ по сравнению со стандартным LINQ, - это когда типы не известны во время компиляции.
Если во время компиляции вы знаете, что запрос будет выполнен против List<Pack>
, вы можете использовать стандартный 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 (извините, я нахожусь на мобильном телефоне, поэтому не могу его переименовать): https://msdn.microsoft.com/en-us/library/bb397927.aspx