C# 在.Net中收集大量数据的最整洁的方法是什么

C# 在.Net中收集大量数据的最整洁的方法是什么,c#,mysql,standards,C#,Mysql,Standards,我正在编写一个程序,它从MySQL数据库收集大量单独的数据,并将这些数据序列化为XML文档 我的XML文档有五个基本组,每个组包含3个子组,我总共收集了大约100条数据 内容本身就是购物网站上的订单详情。我首先运行一个查询来计算并返回需要发送给客户机的下一个订单ID,然后使用这个订单ID从关系数据库中的各个表中提取每一条数据(地址行1、地址行2、购买的物品等) 不管我走哪条路,这都是一团糟。我最终得到了大量的方法,为我需要的每一段数据定义了一个变量,每个变量都等于一个方法的返回值,该方法对我的M

我正在编写一个程序,它从MySQL数据库收集大量单独的数据,并将这些数据序列化为XML文档

我的XML文档有五个基本组,每个组包含3个子组,我总共收集了大约100条数据

内容本身就是购物网站上的订单详情。我首先运行一个查询来计算并返回需要发送给客户机的下一个订单ID,然后使用这个订单ID从关系数据库中的各个表中提取每一条数据(地址行1、地址行2、购买的物品等)

不管我走哪条路,这都是一团糟。我最终得到了大量的方法,为我需要的每一段数据定义了一个变量,每个变量都等于一个方法的返回值,该方法对我的MySQL数据库运行查询。一些数据需要应用额外的逻辑(例如,一些数据需要清理,一些日期需要以XML的特定方式格式化)

几点

  • 我没有创建数据库结构或购物网站,我无法更改它
  • 我有一个正在运行的工作程序。这是我几个月前写的一个程序,我将继续改进它
下面是一些示例代码:

string valueOne = myMethod("SELECT `valueOne` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueTwo = myMethod("SELECT `valueTwo` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueThree = myMethod("SELECT `valueThree` FROM `tableTwo` WHERE `OrderID` = '12345';");
int valueFour = Convert.ToInt32(myMethod("SELECT `valueFour` FROM `tableThree` WHERE `OrderID` = '12345';"));
string valueFive = myMethod("SELECT `valueFive` FROM `tableThree` WHERE `OrderID` = '12345';");

if(valueFive == "FooBar")
{
    //Do Stuff
}

string valueSix = myMethod("SELECT `valueSix` FROM `tableThree` WHERE `OrderID` = '12345';");
DateTime valueSeven = DateTime.Parse(myMethod("SELECT `valueSeven` FROM `tableFour` WHERE `OrderID` = '12345';"));
string valueEight = myMethod("SELECT `valueEight` FROM `tableFive` WHERE `OrderID` = '12345';");
string valueNine = String.Format("QWERTY - {0} - YTREWQ", myMethod("SELECT `valueNine` FROM `tableSix` WHERE `OrderID` = '12345';"));
string valueTen = myMethod("SELECT `valueTen` FROM `tableSeven` WHERE `OrderID` = '12345';");

        MyClass fooBar = new MyClass()
        {
            valueOne = valueOne,
            valueTwo = valueTwo,
            valueThree = valueThree,
            valueFour = valueFour,
            valueFive = valueFive,
            valueSix = valueSix,
            valueSeven = valueSeven,
            mySecondClass = new MySecondClass()
            {
                valueEight = valueEight,
                valueNine = valueNine,
                myThirdClass = new MyThirdClass() { valueTen = valueTen }
            }
        };

SerializeToXML<MyClass>(fooBar);
string valueOne=myMethod(“从`tableOne`中选择`valueOne',其中`OrderID`='12345';”;
字符串valueTwo=myMethod(“从`tableOne`中选择`valueTwo',其中`OrderID`='12345';”;
字符串valueThree=myMethod(“从'tableTwo'中选择'valueThree',其中'OrderID`='12345';”;
int valueFour=Convert.ToInt32(myMethod(“从`tabletree`中选择`valueFour',其中`OrderID`='12345';”);
字符串valueFive=myMethod(“从'tabletree'中选择'valueFive',其中'OrderID`='12345';”;
如果(valueFive==“FooBar”)
{
//做事
}
字符串valueSix=myMethod(“从'tabletree'中选择'valueSix',其中'OrderID`='12345';”;
DateTime valueSeven=DateTime.Parse(myMethod(“从`tableFour`中选择`valueSeven',其中`OrderID`='12345';”);
字符串valueEight=myMethod(“从'tableFive'中选择'valueEight',其中'OrderID`='12345';”;
string valueNine=string.Format(“QWERTY-{0}-YTREWQ”,myMethod(“从`tableix`中选择`valueNine`,其中`OrderID`='12345';”);
字符串valueTen=myMethod(“从`tableSeven`中选择`valueTen`,其中`OrderID`='12345';”;
MyClass fooBar=新的MyClass()
{
valueOne=valueOne,
valueTwo=valueTwo,
valueThree=valueThree,
valueFour=valueFour,
valueFive=valueFive,
valueSix=valueSix,
valueSeven=valueSeven,
mySecondClass=新的mySecondClass()
{
valueEight=valueEight,
valueNine=valueNine,
myThirdClass=新的myThirdClass(){valueTen=valueTen}
}
};
1.1ml(fooBar);
想象一下,但是有更多的数据。是的,它可以工作,但它不整洁,难以维护,更一般地说,不是很好


因此,我的问题是,在.Net应用程序中收集大量数据的正确方法是什么?

一下子,您就可以将许多查询组合成一个查询。例如,您具有以下功能:

string valueOne = myMethod("SELECT `valueOne` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueTwo = myMethod("SELECT `valueTwo` FROM `tableOne` WHERE `OrderID` = '12345';");
string valueThree = myMethod("SELECT `valueThree` FROM `tableTwo` WHERE `OrderID` = '12345';");
int valueFour = Convert.ToInt32(myMethod("SELECT `valueFour` FROM `tableThree` WHERE `OrderID` = '12345';"));
string valueFive = myMethod("SELECT `valueFive` FROM `tableThree` WHERE `OrderID` = '12345';");
我将不再使用这些单独的查询,而是使用单个查询:

SELECT one.valueOne, one.valueTwo, two.valueThree, three.valueFour, three.valueFive
  FROM tableOne one
    INNER JOIN tableTwo two on (two.OrderId = one.OrderId)
    INNER JOIN tableThree three on (three.OrderId = one.OrderId)
  WHERE one.OrderId = '12345';
坦率地说,看起来你可以对其他人做同样的事情

另外,我不完全确定
myMethod
的作用,但它看起来确实只是在查询中返回一个标量值。摆脱它,并用能返回数据表或对象集合的东西替换它。这样,您就可以一次性获取所需的所有数据

注意:如果您希望这些表中的每一个都有基于OrderId的值,那么内部联接就可以工作。如果没有,则从始终具有现有记录的表开始执行外部联接。例如:

SELECT one.valueOne, one.valueTwo, two.valueThree, three.valueFour, three.valueFive
      FROM orders o
        LEFT OUTER JOIN tableOne one on (one.OrderId = o.OrderId)
        LEFT OUTER JOIN tableTwo two on (two.OrderId = o.OrderId)
        LEFT OUTER JOIN tableThree three on (three.OrderId = o.OrderId)
      WHERE o.OrderId = '12345';

您实际上没有充分利用面向对象编程。从您的示例中很难推断表之间的关系,但是Chris Lively在推断表之间的关系方面做得很好,您将其描述为来自购物网站的订单详细信息。当然,这意味着一些一致的关系

我会这样处理这个问题:

  • 开发最高效的整合查询以获取您需要的数据 需要
  • 对于每个查询,创建一个类。将你的课程组织成 匹配您的数据(“五个基本组,每个组包含3个 子群”)
  • 遵循良好的OOP原则,隐藏复杂性 该类中的类所要求的,如果该类是唯一的位置 必需的
  • 对变量和变量使用更具描述性的名称 上课
这将产生更可读、可维护、“整洁”的代码