Linq для обновления набора со значениями от другого набора?

Если комната не может удалить символьную ссылку, возможно, необходимо посмотреть на полномочия на каталоге, который содержит символьную ссылку. Для удаления записей каталога Вы должны записать разрешение на содержании каталога.

17
задан Hcabnettek 21 July 2009 в 18:31
поделиться

4 ответа

Чтобы соединить элементы в двух списках, вы можете использовать соединение LINQ:

var pairs = from d in someData
            join b in baseList.AsEnumerable()
                on d.someCode equals b.myCode
            select new { b, d };

Это даст вам перечисление каждого элемента в someData в паре с его аналогом в baseList . Оттуда вы можете объединить в цикл:

foreach(var pair in pairs)
    pair.b.SomeData += pair.d.DataIWantToConcantenate;

Если вы действительно имели в виду объединение наборов, а не + = , взгляните на методы LINQ Union, Intersect или Except.

18
ответ дан 30 November 2019 в 11:52
поделиться

LINQ предназначен для запросов , а не для обновления. Это означает, что для поиска соответствующего элемента можно использовать LINQ, но для модификации вы должны использовать итерацию.

По общему признанию, вам может потребоваться выполнить соответствующий запрос, чтобы получить baseList Сначала в эффективную форму - например, Dictionary на основе свойства, которое вы будете использовать для поиска соответствующего элемента.

12
ответ дан 30 November 2019 в 11:52
поделиться

Вы можете преобразовать IQueryable в List , используйте метод ForEach для циклического перебора он и обновляет элементы, а затем конвертирует обратно в IQueryable :

List<SomeClass> convertedList = baseList.ToList();
convertedList.ForEach(sc =>
{
    SomeOtherClass oc = someData.First(obj => obj.SomeCode == sc.MyCode);
    if (oc != null)
    {
        sc.SomeData += oc.DataIWantToConcatenate;
    }
});

baseList = convertedList.AsQueryable(); // back to IQueryable

Но при этом может быть более эффективным использование конструкций, отличных от LINQ.

4
ответ дан 30 November 2019 в 11:52
поделиться

Вы не можете просто найти объекты, которые есть в одном списке, но не в другом, потому что это два разных типа. Я предполагаю, что вы сравниваете свойство с именем OtherProperty, которое является общим для двух разных классов и имеет один и тот же тип. В этом случае, используя только запросы Linq:

// update those items that match by creating a new item with an
// updated property
var updated =
    from d in data
    join b in baseList on d.OtherProperty equals b.OtherProperty
    select new MyType()
    {
        PropertyToUpdate = d.PropertyToUpdate,
        OtherProperty = d.OtherProperty
    };

// and now add to that all the items in baseList that weren't found in data
var result =
    (from b in baseList
     where !updated.Select(x => x.OtherProperty).Contains(b.OtherProperty)
     select b).Concat(updated);
0
ответ дан 30 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: