Я столкнулся с этим кодом в одном из наших приложений Entity Framework. Я знаю, что должен быть лучший (более эффективный) способ, чем три запроса, которые выполняет этот код. Хотя я не совсем понимаю синтаксис. (Я все еще изучаю Entity Framework ..)
Здесь задействованы две таблицы. Это простые отношения родитель / ребенок.
Существует таблица вызовов, которая содержит информацию обо всех наших вызовах, а также таблица единиц, которая содержит отдельные серийные номера (единицы), назначенные для каждого вызова. Обратите внимание, что это не отношения между МНОГО-МНОГИЕМ. Таблица Units может / будет содержать дубликаты записей (серийные номера) !!
У вызова может быть 0-Многие дочерние записи в таблице Units.
Итак, когда звонящий звонит, наш Cust Rep вводит серийный номер (всегда создает новую запись в таблице Units), который связывает его с этим вызовом. В этот момент мы заполняем вкладку «История звонков». Эта вкладка построена по запросу ниже. (Выполните поиск в таблице «Единицы измерения» и найдите все Единицы, соответствующие этому Единице, а затем верните все Вызовы, которые назначены всем этим Единицам (записям).)
Подводя итог. Цель запроса: на основе callID найти ЛЮБЫЕ другие вызовы в базе данных, которые также привязаны к ЛЮБОМУ серийному номеру, назначенному этому вызову.
Учитывая, что Entity Framework создал Navigation в таблице tblCall с именем «Categories» и в таблице tblCategory с именем «Call», должен быть лучший / более эффективный способ написания этого запроса. Я действительно хотел бы изменить его. :)
Вот существующий запрос:
//First, get all the Serial Numbers assigned to this Call.
var serials = from units in context.tblUnits
where units.callID == callID
select units.unitSerialNumber;
List<string> serialsList = serials.ToList<string>();
//Get all of the Call IDs that are assigned to any of the serial numbers from the list above
var callIDs = from units in context.tblUnits
where serialsList.Contains(units.unitSerialNumber)
select units.callID;
List<int> callIDList = callIDs.ToList<int>();
//Return all of the calls that are in the callID list from above
var data = from calls in context.tblCalls
where callIDList.Contains(calls.callID)
select calls;
result = data.ToList<tblCall>();
Любой совет очень ценится!
Спасибо за вашу помощь, Даниэль. Вот последний запрос:
var query = (from u1 in context.tblUnits
join u2 in context.tblUnits on u1.unitSerialNumber equals u2.unitSerialNumber
join c in context.tblCalls on u2.callID equals c.callID
where u1.callID == callID
select c).Distinct();
result = query.ToList();