Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数据库表传输到类/将类传输到数据库表_C#_Database_Oop_Dapper - Fatal编程技术网

C# 将数据库表传输到类/将类传输到数据库表

C# 将数据库表传输到类/将类传输到数据库表,c#,database,oop,dapper,C#,Database,Oop,Dapper,这是我问的一个更详细的示例问题: 我在Sql Server中使用c,并使用Dapper作为我的ORM 这是我的桌子: 下面是将组件表加载到应用程序中的类: class DBComponent { public int ID { get; set; } public string Component { get; set; } public int Material_ID { get; set; } public int Color_ID { get; set;

这是我问的一个更详细的示例问题:

我在Sql Server中使用c,并使用Dapper作为我的ORM

这是我的桌子:

下面是将组件表加载到应用程序中的类:

class DBComponent
{
    public int ID { get; set; }
    public string Component { get; set; }
    public int Material_ID { get; set; }
    public int Color_ID { get; set; }
}
然后我需要另一个具有实际值的类:

class Component
{
    public int ID { get; set; }
    public string Component { get; set; }
    public string Material { get; set; }
    public string Color { get; set; }

    public Component(DBComponent C)
    {
        ID = C.ID;
        Component = C.Component;
        Material = //queries the Material Table passing in C.Material_ID and returning the Material Value
        Color = //queries the Color Table passing in C.Color_ID and returning the Color Value
    }
}
我这样做的原因是,我可以将WinForm应用程序的值用于controlscombobox和其他需要。DBComponent类还有一个方法,该方法将获取一个组件对象并创建一个DBComponent对象,该对象将作为新记录发送回数据库


这是处理这种情况的最好办法吗?还是有更好的方法?在我的另一篇文章中,有人提到dapper可以自己完成这项工作,我不需要创建2个类,只需要创建1个类。这是怎么回事?

您可以只使用一个类和一个查询来加载数据。只需构建正确的sql查询,并让Dapper发挥其魔力,将检索到的数据映射到组件类

假设您这样更改组件类

public class Component
{
    public int ID { get; set; }
    public string ComponentX { get; set; }
    public int Color_ID { get; set; }
    public int Material_ID { get; set; }
    public string Material { get; set; }
    public string Color {get;set;}
}
现在,您可以使用表之间的适当联接来检索数据

IEnumerable<Component> SelectComponents()
{
    using (IDbConnection connection = OpenConnection())
    {
        const string query = @"SELECT p.ID, p.Component as ComponentX, 
                                      p.Color_ID, p.Material_ID, 
                                      c.Color, m.Material 
                                FROM Component p 
                                JOIN Color c on p.Color_ID = c.ID 
                                JOIN Material m on p.Material_ID = m.ID";

        return connection.Query<Component>(query, null);
    }
}

请注意,我已将成员组件重命名为ComponentX,因为您不能拥有与封闭类型同名的成员名称

您可以使用隐式运算符来完成此操作。看看这里:@Egbert我可以看到这里如何使用隐式,我不认为我会在这种情况下使用它,但我喜欢这个概念,我会在我的项目的其他部分使用隐式,谢谢!所以从技术上讲,我不需要在类中使用颜色ID和材质ID来进行查询,对吗?不,如果您愿意,可以避免使用它们,但在将来使用它们并没有什么坏处。当然,您不会向用户显示这些值,但这只是UI界面的问题。太好了!我感谢你的帮助,这比我想象的要容易得多。这完全取决于查询。谢谢