Abdalla Ben Omran Ответов: 1

Проблема с рефакторингом метода returen datatable to list<T> ?


Я делаю рефакторинг для метода, который выглядит следующим образом :
private static DataTable getOrdersAll(string OrderID, string OrderLineNo = "")
{
   // do some queries etc
}


я превратил его в нечто подобное :
private static List<BranchSales> getOrdersAll(string OrderID, string OrderLineNo = "")

так я превратилась из объекта DataTable вернуться в список вернуться в<BranchSales&ГТ; до сих пор хорошая
моя проблема в том, что этот метод имеет ссылку и в ссылке выглядит так : "посмотрите, что вы пробовали" ...я просто публикую несколько строк из этого метода....

как я могу изменить DataRow? должен ли я создать новый класс со свойствами, представляющими Datarow ? я застрял здесь, что я должен сделать, чтобы изменить все таблицы данных и потоки данных в список<T>
====== = Обновите вопрос=============

Я выложил весь код целиком
моя проблема сейчас чтобы изменить способ " частный недействительными FuellenStatus(строка AuftragNr)"

за объяснение я буду очень рад
спасибо заранее

Что я уже пробовал:

private static List<BranchSales> getOrdersAll(string OrderID, string OrderLineNo = "")
       {
           List<BranchSales> elements = new List<BranchSales>();
           using (IDbConnection connection = SQL_DB.getSQL_Connection())
           {
               connection.Open();
               DynamicParameters parameters = new DynamicParameters();
               parameters.Add("@OrderID", OrderID);
               elements = connection.Query<BranchSales>("spGetOrdersAll_Intrax_Test", parameters, commandTimeout: 180,commandType: CommandType.StoredProcedure).AsList();
           }
           return elements;
       }

Вот что я изменил в нем .

"Ссылка на метод" :
public static List<BranchSales> getOrdersAll(string OrderNo)
       {
           return getOrdersAll(OrderNo, string.Empty);
       }


метод getOrderAll будет вызываться в этом методе :

public DataTabel IntraxAuftrag;

 private void FuellenStatus(string AuftragNr)
{
 DataTable OffeneBestellung = SQL_DB.getOrdersAll(AuftragNr);

 IntraxAuftrag.Columns.Clear();
                    string sAuftrag = string.Empty;

                    IntraxAuftrag.Columns.Add("Status");
                    IntraxAuftrag.Columns.Add("StatusColor");
                    IntraxAuftrag.Columns.Add("StatusKey");
                    foreach (DataTable dr in OffeneBestellung.Rows)
                    {

                        if (dr[InfoE_Mail_gesendet] == "true")
                        {
                            AnzeigeZahlungen(dr[CustomerNo]);
                            if (sAuftrag != dr.Auftrag)
                            {
                                IntraxAuftrag.Columns.Add(dr["Auftrag"].ToString());
                                sAuftrag = dr["Auftrag"].ToString();
                            }

                            DataRow row = GetRow(IntraxAuftrag, "BranchSaleID", "UNVISIBLE", sAuftrag);
                            row[dr["Auftrag"].ToString()] = dr["branchSaleID"].ToString();
                            try { IntraxAuftrag.Rows.Add(row); } catch { }

                            row = GetRow(IntraxAuftrag, "Sendungslink", "UNVISIBLE", sAuftrag);
                            row[dr["Auftrag"].ToString()] = dr["Sendungslink"].ToString();
                            try { IntraxAuftrag.Rows.Add(row); } catch { }
                        

                            row = GetRow(IntraxAuftrag, "Auftrag", "ALLGEMEIN", sAuftrag);
                            row[dr["Auftrag"].ToString()] = dr["Auftrag"].ToString();
                             try { IntraxAuftrag.Rows.Add(row); } catch { }

                            row = GetRow(IntraxAuftrag, "Zahlungsart", "ALLGEMEIN", sAuftrag);
                            row[dr["Auftrag"].ToString()] = dr["Zahlungsart"].ToString();
                            try { IntraxAuftrag.Rows.Add(row); } catch { }
                        

                            row = GetRow(IntraxAuftrag, "Artikel", "ALLGEMEIN", sAuftrag);
                            row[dr["Auftrag"].ToString()] = dr["itemNo"].ToString();
                            try { IntraxAuftrag.Rows.Add(row); } catch { }

                            row = GetRow(IntraxAuftrag, "Menge", "ALLGEMEIN", sAuftrag);
                            row[dr["Auftrag"].ToString()] = dr["quantity"].ToString();
                            try { IntraxAuftrag.Rows.Add(row); } catch { }

                            row = GetRow(IntraxAuftrag, "Filiale", "ALLGEMEIN", sAuftrag);
                            row[dr["Auftrag"].ToString()] = dr["branchCode"].ToString();
                            try { IntraxAuftrag.Rows.Add(row); } catch { }

                            row = GetRow(IntraxAuftrag, "Adresse", "ALLGEMEIN", sAuftrag);
                            row[dr["Auftrag"].ToString()] = dr["name"].ToString() + dr["street"].ToString() + dr["postcode"].ToString() + "-" + dr["city"].ToString();
                            try { IntraxAuftrag.Rows.Add(row); } catch { }


                            if (dr["cancellation"].ToString() == "False")
                            {
                                row = GetRow(IntraxAuftrag, "Laufzettel gedruckt", "INTERN", sAuftrag);
                                row[dr["Auftrag"].ToString()] = dr["Laufzettel_gedruckt_am"].ToString();
                                try { IntraxAuftrag.Rows.Add(row); } catch { }

                                row = GetRow(IntraxAuftrag, "bestätigt", "INTERN", sAuftrag);
                                row[dr["Auftrag"].ToString()] = dr["Bestellbest_Zeit"].ToString(); //Datum Uhrzeit anzeigen, wenn leer rot, ansonsten grün
                                try { IntraxAuftrag.Rows.Add(row); } catch { }

                                row = GetRow(IntraxAuftrag, "bezahlt", "INTERN", sAuftrag);
                                row[dr["Auftrag"].ToString()] = dr["Zahlungeingegangen_zeit"].ToString();//Datum Uhrzeit anzeigen, wenn leer rot, ansonsten grün
                                try { IntraxAuftrag.Rows.Add(row); } catch { }


                                row = GetRow(IntraxAuftrag, "Rechnung", "INTERN", sAuftrag);
                                row[dr["Auftrag"].ToString()] = dr["Rechnungsdruck_Zeit"].ToString();//Datum Uhrzeit anzeigen, wenn leer rot, ansonsten grün
                                try { IntraxAuftrag.Rows.Add(row); } catch { }


                                row = GetRow(IntraxAuftrag, "Filialrechnung", "INTERN", sAuftrag);
                                row[dr["Auftrag"].ToString()] = dr["Rechnungsdatum"].ToString();//Datum Uhrzeit anzeigen, wenn leer rot, ansonsten grün
                                try { IntraxAuftrag.Rows.Add(row); } catch { }


                                row = GetRow(IntraxAuftrag, "Ver. beauftrag", "INTERN", sAuftrag);
                                row[dr["Auftrag"].ToString()] = dr["Versanddienstleider_Zeit"].ToString();//Datum Uhrzeit anzeigen, wenn leer rot, ansonsten grün
                                try { IntraxAuftrag.Rows.Add(row); } catch { }

                                row = GetRow(IntraxAuftrag, "versendet", "VERSAND", sAuftrag);
                                row[dr["Auftrag"].ToString()] = dr["Versandbestätigt_Zeit"].ToString();//Datum Uhrzeit anzeigen, wenn leer rot, ansonsten grün
                                try { IntraxAuftrag.Rows.Add(row); } catch { }

                                row = GetRow(IntraxAuftrag, "Tracking", "VERSAND", sAuftrag);
                                row[dr["Auftrag"].ToString()] = dr["Tracking_Zeit"].ToString();//Datum Uhrzeit anzeigen, wenn leer rot, ansonsten grün
                                try { IntraxAuftrag.Rows.Add(row); } catch { }

                                row = GetRow(IntraxAuftrag, "zugestellt/unterwegs", "KUNDE", sAuftrag);
                                DataTable dtDelivery = SQL_DB.GetDeliveryOrder(dr["branchSaleID"].ToString(), string.Empty);
                                if (dtDelivery.Rows.Count > 0)
                                {
                                    row[dr["Auftrag"].ToString()] = dtDelivery.Rows[0]["StatusTrex"].ToString();
                                }
                                try { IntraxAuftrag.Rows.Add(row); } catch { }

                                if (dr["BranchShipment"].ToString() == "True")
                                {
                                    DataTable dtAusFil = SQL_DB.getAuslieferungsFiliale(AuftragNr, Convert.ToInt32(dr["OrderLineNo"].ToString()));
                                    if (dtAusFil.Rows.Count > 0)
                                    {
                                        row = GetRow(IntraxAuftrag, "Übergabe in Filiiale", "INTERN", sAuftrag);
                                        row[dr["Auftrag"].ToString()] = dtAusFil.Rows[0]["branchCode"].ToString();
                                        try { IntraxAuftrag.Rows.Add(row); } catch { }


                                        row = GetRow(IntraxAuftrag, "Übergabe an Kunde", "KUNDE", sAuftrag);
                                        row[dr["Auftrag"].ToString()] = dtAusFil.Rows[0]["BranchShipmentReceived_delivered_Date"].ToString();
                                        try { IntraxAuftrag.Rows.Add(row); } catch { }
                                    }
                                }
                            }
                            else
                            {
                                row = GetRow(IntraxAuftrag, "Status", "STORNIERT", sAuftrag);
                                row[dr["Auftrag"].ToString()] = "STORNIERT";
                                try { IntraxAuftrag.Rows.Add(row); } catch { }
                            }
                            IntraxAuftrag = ReadRetouren(dr["branchSaleID"].ToString(), dr["Auftrag"].ToString(), IntraxAuftrag);
                        }
                    }

                }

1 Ответов

Рейтинг:
1

OriginalGriff

Я не совсем понимаю, что вы здесь пытаетесь сделать - ваше описание не имеет большого смысла, и вы не показываете никаких звонков в полицию. getOrdersAll- но похоже, что вы пытаетесь изменить метод с возврата DataTable на возврат списка определенного класса.

Предполагая, что вы правильно изменили метод, ваше описание подразумевает, что при его вызове вы получаете ошибку, потому что возвращаемые типы больше не совпадают, что имеет смысл - вы не можете использовать список в качестве DataTable; эти два типа не связаны. Вам придется изменить вызывающий код, чтобы ожидать a List<BranchSales> вместо DataTable.

Или, может быть, вы пытаетесь преобразовать каждый экземпляр DataRow в таблице в экземпляр вашего BranchSales класс, чтобы вы могли добавить его в коллекцию для возврата - в этом случае вам нужно создать новый экземпляр класса. BranchSales для каждого DataRow и заполните его данными из вашего DataTable. Затем вы можете добавить этот экземпляр в коллекцию.

Если ни то, ни другое не является вашей проблемой, вам нужно будет объяснить гораздо более подробно, что именно вы пытаетесь сделать, дать нам любые сообщения об ошибках и показать нам код, к которому они относятся.


[no name]

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

[no name]

обновлено еще раз . извиняюсь

OriginalGriff

И посмотрите на свой код:

DataTable OffeneBestellung = SQL_DB.getOrdersAll(AuftragNr);

getOrdersAll больше не возвращает DataTable, поэтому вам нужно изменить код, который его вызывает, чтобы поддерживать список, который вы возвращаете.

Вы не можете назначить список переменной, содержащей DataTable, эти два типа не связаны! Это все равно что пытаться сделать вот это
FruitBasket fruits = myCarPark.GetAllCars();

[no name]

var OffeneBestellung = SQL_DB.getOrdersAll(AuftragNr);
я сделал следующее

OriginalGriff

Я ненавижу это - используйте явные классы, а не var, если тип не очевиден из кода.
Но... Готов поспорить, что остальная часть кода сейчас не работает, потому что в списке нет коллекции строк...

[no name]

что моя точка зрения с самого начала (список не имеет коллекции строк) - это то, что я имел в виду в своем quetion ?!

OriginalGriff

О, боже мой...

Вы не можете просто изменить тип возвращаемого значения и ожидать, что оно будет работать: вы возвращаете значение другого типа, и оно будет поддерживать только те поля, свойства, методы, события и делегаты, которые определены для нового класса, а не для старого!

Список не имеет свойства Rows, он вообще не содержит элементов DataRow - он содержит экземпляры вашего класса BranchSales, и они почти наверняка не содержат свойства Cells. Это список, а не DataTable, и у него есть свойства списка и методы!

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

[no name]

таким образом, DataRow должен быть экземпляром из класса BranchsSales ..я сделаю все возможное, потому что "GetRow" - это метод и имеет 55 ссылок . я проведу весь октябрь, пытаясь восстановить код

OriginalGriff

Это может показаться глупым вопросом, но ..... почему ты пытаешься это сделать?

Я могу понять желание вернуть коллекцию экземпляров класса вместо DataTable, но похоже, что вы действительно не понимаете, что это значит - инкапсуляция потока данных в классе не является реальным решением, и я ожидаю, что вы будете использовать фактическую информацию об экземпляре класса вместо того, чтобы вообще нуждаться в строке. В противном случае ваш метод getOrdersAll должен построить каждый экземпляр e=, m и создать DataRow, а также содержать ту же информацию! Что, очевидно, довольно глупо ... :смеяться:

[no name]

я просто пытаюсь читать код от других людей и рефакторинговать часть кода в качестве обучения, но я имел в виду не использовать DataRow .. я имею в виду использовать экземпляр BrachSales

OriginalGriff

Хорошо! :большой палец вверх: