我有一个模型类,它具有许多公共属性(名称,地址等)。这些属性与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的新手,所以对于列表对象我可能完全不了解。
答案 0 :(得分:1)
您的变量client
是一个列表。列表中没有Fname。您可以
client[0].Fname
或以其他方式对其进行索引。
由于您是新手,所以这里还有一些其他提示:
使用字符串插值:
string clientName = "{client.FName} {client.MName} {client.LName}".ToUpper();
编辑:
再次查看您的问题,我认为您想使用FirstOrDefault
或Single
。 FirstOrDefault
将采用列表中的第一项;如果列表为空,则采用默认值(空)。 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);
}
}