я знаю, что это не сложно, но я борюсь с этим.
У меня есть 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.