0

我的问题有两个部分,如何做,以及它是否是好的风格。

  • TestDataBaseEntities是正在传递的 DBContext 项。
  • myQuery是正在执行和读取的查询
  • StatusMessage从函数中传递给 UI 以报告操作是否成功。
  • Records是我需要帮助弄清楚的。我需要弄清楚如何将每条记录传递回ReadMan().

我在想一个 2d 字符串数组被传回会让我受益,因为我可以让这个DataAccess类读取数据,并准备在我的UserInterface类中显示。但问题就在于此。

要声明string[,],我需要知道字符串的大小,或者通过这样做隐含地给它尺寸Records[,] = new string[,] { { FirstField, SecondField }, { FirstField, SecondField } ... }等等,但是不能,因为读入的第一条记录没有提供需要告诉的信息Records它的第二个索引应该有多大[ , ThisIndex],如果我有这个工作,我会将 2d 传递RecordsUserInterface类以显示给用户。

为什么要有这个Read功能?因为我应该将 EF 函数与 UI 分开,对吗?

public class DataAccess
{
    public bool ReadMan(TestDatabaseEntities dbEntities, IQueryable myQuery, out string StatusMessage, out string[,] Records)
    {
        string ErrorMessage;
        bool bSuccessful;
        string[] ThisRecord;

        bSuccessful = TryDataBaseAction(dbEntities, out ErrorMessage,
            () =>
            {   
                foreach (Man m in myQuery)
                {
                    // was thinking ThisRecord could be temporary storage but doesn't seem to work to my benefit.
                    ThisRecord = new string[] { m.ManID.ToString(), m.Name };

                }
            });
        if (bSuccessful)
            StatusMessage = "Records read successfully";
        else
            StatusMessage = ErrorMessage;


        return bSuccessful;
    }

    public bool TryDataBaseAction(TestDatabaseEntities MyDBEntities, out string ErrorMessage, Action MyDBAction)
    {
        UserInterface MyUI = new UserInterface();
        try
        {
            MyDBAction();
            ErrorMessage = "No Error";
            return true;
        }
        catch (Exception e)
        {
            ErrorMessage = e.ToString();
            return false;
        }
    }
}

编辑:固定

    public bool ReadMan(TestDatabaseEntities dbEntities, IQueryable myQuery, out string StatusMessage, out string[,] Records)
    {
        string ErrorMessage;
        bool bSuccessful;
        string[,] TheseRecords = null;

        // hands an Action() to TryDataBase, as indicated by lambda expression in 3rd arguement.
        bSuccessful = TryDataBaseAction(dbEntities, out ErrorMessage,
        () =>
        {
            List<Man> men = myQuery.OfType<Man>().ToList();
            TheseRecords = new string[men.Count, 2];

            // ERROR BELOW: Operator '<' cannot be applied to operands of type 'int' and 'method group' 
            for (int i = 0; i < men.Count; i++)
            {
                TheseRecords[i, 0] = men[i].ManID.ToString();
                TheseRecords[i, 1] = men[i].Name;
            }
        });

        Records = TheseRecords;

        if (bSuccessful)
            StatusMessage = "Records read successfully";
        else
            StatusMessage = ErrorMessage;


        return bSuccessful;
    }
4

1 回答 1

0

这有帮助吗?

bSuccessful = TryDataBaseAction(dbEntities, out ErrorMessage,
() =>
{   
    List<Man> men = myQuery.OfType<Man>().ToList();
    Records = new string[men.Count, 2];

    for (int i = 0; i < men.Count; i++)
    {
        Records[i, 0] = men[i].ManID.ToString();
        Records[i, 1] = men[i].Name;
    }
});

这里的关键是转换myQuery成一个列表,以便我们可以访问它的Count属性。一旦我们有了它,就可以直接创建Records数组了。

这样做是否是好的风格更加主观,并且实际上取决于您的应用程序的架构方式。一般来说,我的数据访问层只负责执行查询和检索数据——它留给用户界面来处理视觉表示。

将此方法应用于您的特定情况,如果该ReadMan方法将某个List或其他集合作为out参数而不是二维数组,则可能会更容易。这样,调用方法可以轻松地创建所需的表示(您知道要处理多少项),而且您可以避免用户界面细节潜入数据访问层。

您可能已经这样做了,但要考虑的另一件事是您当前的方法如何处理大量数据。myQuery我们正在物化myQuery.

于 2012-11-11T23:49:22.833 回答