У меня есть структура таблицы, каждая таблица с полем первичного ключа с именем "ID" и именами внешнего ключа, совпадающими с первичным ключом их родительской таблицы. Поэтому в таблицах ниже есть отношения, в которых их первичный ключ отображается в другой таблице, а первое поле в любой таблице - это его первичный ключ:
Category
--------
CategoryID
Title
CategoryList
------------
CategoryListID
CategoryID
ListID
List
----
ListID
Title
DataPoint
---------
DataPointID
RecordedDateTime
DataPointValue
--------------
DataPointValueID
DataPointID
TheValue
Выше приведено соединение «многие ко многим» между Category и List через CategoryList. Это также соединение «один ко многим» из списка в DataPoint, из DataPoint в DataPointValue.
Используя C # / LINQ и учитывая список значений CategoryID, я бы хотел получить:
Все записи списка, прикрепленные к категории, для которой у меня есть идентификаторы. С этими записями в Списке я хотел бы взять самую последнюю 1 DataPoint в соответствии с порядком RecordedDateTime Descending. Оттуда я хотел бы получить все данные DataPointValue, прикрепленные к DataPoint.
LINQ, который у меня есть:
Контекст DBDataContext = новый DBDataContext (ConnectionString);
context.LoadOptions = new DataLoadOptions();
context.LoadOptions.LoadWith<DataPoint>(p => p.DataPoints.OrderByDescending(p.RecordedDataTime).FirstOrDefault());
// this next line is how I get the list of category IDs, but don't worry about that...
List<int> categoryIDs = (from TreeNode n in nodes
select Int32.Parse(n.Value)).Distinct().ToList();
var lists = from i in context.List
join ci in context.CategoryLists on i.ListID equals ci.ListID
join p in context.DataPoints on i.ListID equals p.ListID
join v in context.DataPointValues on p.DataPointID equals v.DataPointID
where categoryIDs.Contains(ci.CategoryID)
orderby i.Title ascending
select new
{
List = i,
DataPoint = p,
DataPointValues = p.DataPointValues
};
Но это, очевидно, не работает - LoadWith вызывает у меня проблемы. Может кто-нибудь объяснить, как построить LoadWith так, чтобы он вызывал как можно меньше запросов SQL для извлечения этого (предположительно большого) объема данных, пожалуйста?
Большое спасибо,
Мт.