Обновление коллекции из объекта DbSet через Linq - PullRequest
0 голосов
/ 28 июня 2018

я знаю, что это не сложно, но я борюсь с этим.

У меня есть IList<Material> коллекция

public class Material
{
    public string Number { get; set; }
    public decimal? Value { get; set; }
}

materials = new List<Material>();

materials.Add(new Material { Number = 111 });
materials.Add(new Material { Number = 222 });

А у меня есть DbSet<Material> коллекция с столбцами Число и ЗначениеКолонка

Мне нужно обновить IList<Material> Значение свойства, основанное на коллекции DbSet<Material>, но с соблюдением следующих условий

  • Только один запрос в базу данных
  • Возвращаемые данные из базы данных должны быть ограничены числовым идентификатором (не загружать всю таблицу базы данных в память)

Я попробовал следующее (основываясь на моем предыдущем вопросе )

Рабочий раствор 1 , но загрузка всей таблицы в память (отслеживается в SQL Server Profiler).

var result = (

       from db_m in db.Material
       join m in model.Materials
       on db_m.Number.ToString() equals m.Number

       select new
       {
           db_m.Number,
           db_m.Value
       }

).ToList();

model.Materials.ToList().ForEach(m => m.Value= result.SingleOrDefault(db_m => db_m.Number.ToString() == m.Number).Value);

Рабочий раствор 2 , но он выполняет запрос для каждого элемента в коллекции.

model.Materials.ToList().ForEach(m => m.Value= db.Material.FirstOrDefault(db_m => db_m.Number.ToString() == m.Number).Value);

Неполное решение , где я пытался использовать, содержит метод

// I am trying to get new filtered collection from database, which i will iterate after.
                var result = db.Material
                    .Where(x=> 
                        // here is the reasonable error: cannot convert int into Material class, but i do not know how to solve this.
                        model.Materials.Contains(x.Number)
                    )
                    .Select(material => new Material { Number = material.Number.ToString(), Value = material.Value});

Есть идеи? Для меня гораздо проще выполнить хранимую процедуру с разделенными запятыми значениями идентификатора в качестве параметра и получить данные напрямую, но я тоже хочу освоить linq.

1 Ответ

0 голосов
/ 28 июня 2018

Я бы сделал что-то подобное, не пытаясь стать слишком милым:

var numbersToFilterby = model.Materials.Select(m => m.Number).ToArray();
...
var result = from db_m in db.Material where numbersToFilterBy.Contains(db_m.Number) select new { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...