#c# #linq
#c# #linq
Вопрос:
Может ли кто-нибудь помочь мне выполнить этот запрос Linq и показать мне, как извлечь разные названия продуктов
List<StatePlan> planTypes = (from ppt in context.PlanPlanTypes
join pt in context.PlanTypes on ppt.PlanTypeRowID equals pt.PlanTypeRowID
join ppts in context.PlanPlanTypeStates on ppt.PlanPlanTypeRowID equals ppts.PlanPlanTypeRowID
join p in context.Plans on ppt.PlanRowID equals p.PlanRowID
where ppts.StateCode == stateCode
where p.IsActive == true
select new StatePlan
{
PlanID = p.PlanRowID,
StateCode = stateCode,
Name = p.Name,
Description = p.Description,
Disclaimer = p.Disclaimer,
Sequence = p.DisplaySequence,
//Rates = GetRates(p.PlanRowID),
//Types = GetPlanTypes(p.PlanRowID, stateCode)
}).ToList();
return planTypes;
Ответ №1:
Я не уверен, правильно ли я понял вопрос, но если вам нужны элементы с определенным отдельным полем, вы можете сначала использовать groupby :
seq.GroupBy(item=>item.Name).Select(group=>group.First())
Вы также могли бы использовать средство сравнения равенства проекций, но я считаю это немного некрасивым. Для меня использование Distinct
подразумевает, что вам все равно, какой из эквивалентных элементов вы получите. В то время как groupby first явно указывает, что вам нужен первый элемент.
GroupBy также позволяет вам собирать дополнительную информацию в вашем Select
предложении, например, сколько элементов с таким именем существует.
Если вам нужны только разные имена без связанного элемента, объедините select и distinct:
seq.Select(item=>item.Name).Distinct()
Ответ №2:
Сначала сгруппируйте его, затем возьмите первый
List<StatePlan> planTypes = (from ppt in context.PlanPlanTypes
join pt in context.PlanTypes on ppt.PlanTypeRowID equals pt.PlanTypeRowID
join ppts in context.PlanPlanTypeStates on ppt.PlanPlanTypeRowID equals ppts.PlanPlanTypeRowID
join p in context.Plans on ppt.PlanRowID equals p.PlanRowID
where ppts.StateCode == stateCode
where p.IsActive == true
select new StatePlan
{
PlanID = p.PlanRowID,
StateCode = stateCode,
Name = p.Name,
Description = p.Description,
Disclaimer = p.Disclaimer,
Sequence = p.DisplaySequence,
//Rates = GetRates(p.PlanRowID),
//Types = GetPlanTypes(p.PlanRowID, stateCode)
})
.GroupBy(g => g.Name)
.Select(s => s.First())
.ToList();
return planTypes;
Комментарии:
1. Это отлично сработало, однако мне нужно было изменить на s.FirstOrDefault()
2. @JonHarding Зачем тебе это изменение? Я бы ожидал, что в каждой группе будет хотя бы один элемент.
3. Была выдана ошибка: «Метод ‘First’ может использоваться только в качестве заключительной операции запроса. Вместо этого рассмотрите возможность использования метода ‘FirstOrDefault’ в этом экземпляре.» Я попробовал это предложение, и оно сработало.
Ответ №3:
planTypes.Select(pt=>pt.Name).Distinct();
Ответ №4:
Вы можете вызвать Distinct
и предоставить IEqualityComparer для StatePlan
Ответ №5:
Предполагая, что название продукта является Name
свойством в planTypes
списке и что это строка:
List<string> productNames = planTypes.Select(t => t.Name).Distinct().ToList();