如何将Dapper检索到的列表分配给类模型中的属性?

时间:2019-06-04 19:17:41

标签: c# dapper

我有一个模型类,它具有许多公共属性(名称,地址等)。这些属性与SQL数据库中的列完全匹配。我有一个允许用户输入客户ID号的表格,然后单击,将客户ID传递给业务逻辑类中的方法,该业务逻辑类又调用使用Dapper Query的常规数据访问类以返回客户从SQL数据库记录。此结果绑定到datagridview,并且工作正常。

(这样可以正常工作:Form> BLClass> DataAccessClass> BLClass> Form)

但是,在我的业务逻辑类中,我希望能够访问模型类中的所有属性,因此我可以生成报告并运行一些计算。我可以为模型类创建一个新的空实例,并且所有属性都出现在intellisense中的圆点之后,但是当我尝试访问由DataAccess类返回的,列表类型的实际列表时,我无法设置或获取模型类中的任何属性。

注意:我的业务类方法从public void方法开始,但是为了将列表返回到要在datagridview中使用的表单,我不得不使方法成为“ public List CreateReport(int ClientID);”。我不在乎在表单上显示结果-我总是可以分别填充。我只需要能够在业务逻辑类中填充模型类的属性,以便可以在报表中使用它们。

//The model class
public class ClientModel
{

    public int ClientID { get; set; }
    public string ClientPosition { get; set; }
    public string Fname { get; set; }
    public string MName { get; set; }
    public string LName { get; set; }
    //etc.  
}

//The business logic class 

public void CreateReport(int ClientID);

List<ClientModel> client = DataConfig.Connection.GetClientByID(ClientID).ToList();

string ClientName = (client.FName + " " + client.MName + " " + client.LName).ToUpper();
string ClientNameFooter = client.FName + " " + client.MName + " " + client.LName;

//Etc., with the int's and strings eventually replacing bookmarked sections in a Word template using Word.Interop.

当我尝试访问client.Fname时,出现错误“列表”不包含“ FName”的定义,并且找不到可以接受的扩展方法“ FName”接受类型为“ List”的第一个参数。”

我尝试将列表变量“客户端”分配给客户端模型的空实例,但出现错误“无法将类型'ReportGenerator.ClientModel'隐式转换为'System.Collections.Generic.List.ReportGenerator.ClientModel'

C#和Dapper的新手,所以对于列表对象我可能完全不了解。

3 个答案:

答案 0 :(得分:1)

您的变量client是一个列表。列表中没有Fname。您可以

client[0].Fname

或以其他方式对其进行索引。

由于您是新手,所以这里还有一些其他提示:

  • 帮您自己和需要维护代码的人,请使用长的变量/属性名称。所以用FirstName代替Fname。
  • 保持一致。不要叫一个属性Fname和另一个MName。
  • 按照约定,局部变量以小写字母开头:clientName不是ClientName。
  • 使用字符串插值:

    string clientName = "{client.FName} {client.MName} {client.LName}".ToUpper(); 
    

编辑: 再次查看您的问题,我认为您想使用FirstOrDefaultSingleFirstOrDefault将采用列表中的第一项;如果列表为空,则采用默认值(空)。 Single将只包含一项,否则将引发异常。

ClientModel client = DataConfig.Connection.GetClientByID(ClientID).Single();

然后,您将不必迭代或索引到列表中。

答案 1 :(得分:0)

我将按照本教程中的说明使用Dapper:https://dapper-tutorial.net/query

string sql = "SELECT TOP 10 * FROM ClientModels";

using (var connection = new SqlConnection("your connection string"))
{           
    var clientModels = connection.Query<ClientModel>(sql).ToList();
    foreach(var clientModel in clientModels)
    {
        // do something with clientModel
        ...
    }
}

答案 2 :(得分:0)

我注意到您正在传递一个ClientId ...听起来是唯一的..因此,也许它不是您需要的列表。

public void CreateReport(int ClientID)
{
    try
    {
         ClientModel client = DataConfig.Connection.GetClientByID(ClientID).FirstOrDefault();

         if(client != null)
         {
             string ClientName = (client.FName + " " + client.MName + " " + client.LName).ToUpper();
             string ClientNameFooter = client.FName + " " + client.MName + " " + client.LName;

             Debug.WriteLine("ClientName: {0}", ClientName);
             Debug.WriteLine("ClientNameFooter: {0}", ClientNameFooter);
         }
         else
         {
             Debug.WriteLine("Couldn't find a client with that Id...");
         }
    }
    catch (Exception ex)
    {
         throw new Exception(ex.Message);
    }
}