Entity Framework запрос - PullRequest
       2

Entity Framework запрос

0 голосов
/ 06 августа 2010

Я столкнулся с этим кодом в одном из наших приложений 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();

1 Ответ

0 голосов
/ 06 августа 2010

Я думаю, вы могли бы заменить его запросом, подобным следующему:

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 ?? -1) equals c.callID
        where u1.callID == callID
        select c;

var result = query.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...