linq
запрос Where
пункт можно применить func
к элементу в исходном наборе и возвращать bool
включать или не включать элемент на основании характеристик элемента. Отличный материал:Linq запрос, где есть определенное желаемое соотношение между элементами в результате
var q = myColl.Where (o => o.EffectiveDate = LastThursday);
Но что, если я хочу найти набор элементов, в которых каждый элемент связан с последним элементом? Как:
var q = myColl.Where(o => o.EffectiveDate = thePreviousItem.ExpirationDate);
Как вы делаете Where
(или другой linq
функция) «выскочить» из текущего пункта?
Вот что я пытался, пытаясь быть умным. Я сделал каждый элемент массива, чтобы убедиться, что я могу использовать Aggregate
функцию:
public IQueryable<T> CurrentVersions
{
get => AllVersions
.Select(vo => new T[] { vo })
.Aggregate((voa1, voa2) => voa1[0].BusinessExpirationDate.Value == voa2[0].BusinessEffectiveDate.Value ? voa1.Concat(voa2).ToArray() : voa1)
.SelectMany(vo => vo);
}
но не компилируется на SelectMany
в:
Аргументы типа для метода
Enumerable.SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>)
не может быть выведено из Применение. Попробуйте явно указать аргументы типа .
EDIT (РАСТВОР)
Как оказалось, я был на правильном пути, но был просто запутался о том, что SelectMany
делает. Мне это не нужно. Мне также необходимо было изменить на IEnumerable
, потому что я использую EF, и вы не можете запросить после того, как вы отпустите DbContext
. Итак, вот фактическое решение.
public IEnumerable<T> CurrentVersions
{
get => AllVersions
.Select(vo => new T[] { vo })
.Aggregate((voa1, voa2) => voa1[0].BusinessExpirationDate.Value == voa2[0].BusinessEffectiveDate.Value ? voa1.Concat(voa2).ToArray() : voa1);
}
Спасибо! Я думал о zip и пропустить, но пока вы не увидите его, вы не можете визуализировать его, чтобы ввести его. И к тому времени, когда набор будет уменьшен до этой функции, это всего лишь несколько строк данных. Таким образом, неэффективность не сильно влияет. – toddmo
> Install-Package "System.ValueTuple" -IncludePrerelease – toddmo
Вы также можете использовать анонимный объект вместо кортежа. –