Добавьте лямбду в запросе LINQ, чтобы заменить строку в foreach - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть ситуация, когда мне приходится сопоставлять несколько номеров клиентов из одной системы с одним номером клиента в другой системе.Так, например, все номера клиентов 225, 228 и 223 в системе A будут сопоставлены с номером клиента 110022 в системе B. Достаточно просто, у меня есть для этого настройка матрицы.

Я извлекаю данные матрицы следующим образом:

 var dt_th_matrix = (from m in aDb.Matrix_Datatrac_TopHat select m).ToArray();

Таким образом, записи будут выглядеть примерно так:

customerA: 3 CustomerB: 1001

CustomerA: 4 CustomerB: 1001

CustomerA:5 Клиент: 1002

Затем я собираю большие данные и перебираю все элементы.Для каждого из пунктов я выбираю соответствующий номер клиента из матрицы следующим образом:

foreach (var dt_stop in mainPull)
        {
            int? th_customerId = (from d in dt_th_matrix 
                                  where d.datatrac_customer_no == dt_stop.Customer_No.ToString() 
                                  select d.tophat_customer_detail_Id).First();

Я бы предпочел просто встроить код, чтобы получить номер клиента из матрицы непосредственно в моей таблице данных.- часть «Запрос идет как-то здесь» будет некоторой разновидностью лямбды, я полагаю.Любая помощь?

Я пробовал что-то вроде этого:

  th_customerId = (dt_th_matrix.First().tophat_customer_detail_Id.Equals c.Customer_No)

Но это не так (очевидно)

var mainPull = (from c in cDb.DistributionStopInformations
                        join rh in cDb.DistributionRouteHeaders on c.Route_Code equals rh.Route_Code
                        where c.Company_No == 1 &&
                       (accountNumbers.Contains(c.Customer_No)) &&
                         (brancheSearchList.Contains(c.Branch_Id) && brancheSearchList.Contains(rh.Branch_Id)) &&
                        c.Shipment_Type == "D" &&
                       (c.Datetime_Created > dateToSearch || c.Datetime_Updated > dateToSearch) &&
                       rh.Company_No == 1 &&
                       ((rh.Route_Date == routeDateToSearch && c.Route_Date == routeDateToSearch) ||
                       (rh.Route_Date == routeDateToSearch.AddDays(1) && c.Route_Date == routeDateToSearch.AddDays(1)))
                        orderby c.Unique_Id_No
                        select new
                        {
                            c.Datetime_Updated,
                            th_customerId = ("Query goes here somehow")
                            c.Datetime_Created,
                            c.Unique_Id_No,
                            c.Original_Unique_Id_No,
                            c.Unique_Id_Of_New_Stop,
                            c.Branch_Id,
                            c.Route_Date,
                            c.Route_Code,
                            c.Sequence_Code,
                            c.Customer_No,
                            c.Customer_Reference,
                            c.Shipment_Type,
                            c.Stop_Name,
                            c.Stop_Address,
                            c.Stop_City,
                            c.Stop_State,
                            c.Stop_Zip_Postal_Code,
                            c.Stop_Phone_No,
                            c.Stop_Arrival_Time,
                            c.Stop_Departure_Time,
                            c.Address_Point,
                            c.Stop_Special_Instruction1,
                            c.Stop_Special_Instruction2,
                            c.Stop_Expected_Pieces,
                            c.Stop_Expected_Weight,
                            c.Stop_Signature,
                            c.Actual_Arrival_Time,
                            c.Actual_Depart_Time,
                            c.Actual_Service_Date,
                            c.Stop_Actual_Pieces,
                            c.Stop_Exception_Code,
                            c.Created_By,
                            rh_Route_Date = rh.Route_Date,
                            routeHeaderRouteCode = rh.Route_Code,
                            rh.Actual_Driver,
                            rh.Assigned_Driver,
                            rh_routeDate = rh.Route_Date

                        }).ToArray();

Я постараюсь уточнить выше.

Мне нужно, чтобы запрос Linq сказал: для каждой извлекаемой записи я попаду в массив с именем dt_th_matrix, получу запись, соответствующую этой строке, и использую ее.

данные в матрице выглядят в точности так:

Запись 1: datatrac_customer_no: 227, tophat_customer_detail_Id 1

Запись 2: datatrac_customer_no: 228, tophat_customer_detail_Id: 1 * 10rac_D3: 1034 * 10: 910, tophat_customer_detail_Id: 5

Затем для первой записи, извлеченной в mainPull, поле c.customer_no == 228, поэтому мне нужен запрос в операторе select new, чтобы заменить th_customerId на 1 (из записи 2 вМатрица.

Затем, скажем, следующая запись вытащила в mainPull поле c.customer_no = 910 th_customerId будет 5.

Это то, что первая строка mу foreach заявление в настоящее время делает.Я хочу переместить эту логику внутрь моего запроса LINQ.

1 Ответ

0 голосов
/ 20 декабря 2018

Если я вас правильно понимаю, использование словаря с ключом datatrac_customer_no и значением tophat_customer_detail_Id было бы хорошей идеей здесь:

var dt_th_matrix = (from m in aDb.Matrix_Datatrac_TopHat select m).ToDictionary(m=>m.datatrac_customer_no,m=>m.tophat_customer_detail_Id);

При этом вы должны иметь возможность заменить ваш запросздесь как-то "с

dt_th_matrix[c.Customer_No]

Использование LINQ также было бы возможно, но я не думаю, что это стоит затрат на производительность и снижение читабельности.

Если вы все еще хотите использовать LINQ для этого с вашей исходной матрицей, это должно работать как ваш запрос:

dt_th_matrix.Single(m => m.datatrac_customer_no == c.Customer_No).tophat_customer_detail_Id

Оба выражения выдают исключение, если ключ не найден или существуетнесколько раз - но если я правильно понимаю вашу структуру, это не должно быть возможным.В противном случае вам нужно проверить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...