Вот моя объектная модель.
public class ItemViewModel
{
public Item ItemObject { get; set; }
public IEnumerable<LineItem> Fields { get; set; } = new List<LineItem>();
}
public class Item
{
public int ItemId { get; set; }
public DateTime DatePurchased { get; set; }
}
public class LineItem
{
public int ItemId { get; set; }
public string Name { get; set; }
}
База данных содержит Элементы и LineItems таблицы, соответствующие объектной модели. Я использую приведенное ниже выражение LINQ для извлечения объекта ItemViewModel
при условии ИД элемента.
var i = from i in _dbContext.Items
where i.ItemId == 123
select new ItemViewModel
{
ItemObject = i,
Fields = from field in _dbContext.LineItems
where field.ItemId == i.ItemId
select field
};
var viewModel = await i.SingleOrDefaultAsync();
Код компилируется нормально, но после его выполнения свойство viewModel.Fields
содержит только один элемент списка, тогда как три элемента строки против ItemID: 123 в таблице базы данных.
SQL, сгенерированный этим фрагментом (перехваченный через SQL Profiler), возвращает три позиции через LEFT JOIN. Это означает, что сгенерированный SQL в порядке, но что-то не так с Entity Framework, но я не знаю что?
Обновление: Вот сгенерированный запрос SQL, который правильно дает мне три строки:
SELECT
[t].[ItemId], [t].[DatePurchased],
[s0].[ItemId], [s0].[Name]
FROM
(
SELECT
TOP(2) [s].[ItemId], [s].[DatePurchased]
FROM
[Items] AS [s]
WHERE
[s].[ItemId] = 123
) AS [t]
LEFT JOIN [LineItems] AS [s0] ON [t].[ItemId] = [s0].[ItemId]
ORDER BY [t].[ItemId]
Технический стек равен. NET Core 3.1 и Entity Framework Core.