C# 连接两个表的C Sharp通用简洁查询

C# 连接两个表的C Sharp通用简洁查询,c#,generics,join,dapper,multiple-tables,C#,Generics,Join,Dapper,Multiple Tables,我是一个不折不扣的人,但以下是我想做的事情的要点: public IEnumerable<T> GetAll<T, K>(string schemaName) where T : GenericModel { var sql = @"SELECT * from " + schemaName + "." + T.getTableName() + " primaryTable LEFT JOIN " +

我是一个不折不扣的人,但以下是我想做的事情的要点:

    public IEnumerable<T> GetAll<T, K>(string schemaName) where T : GenericModel
    {
        var sql = @"SELECT * from " +
            schemaName + "." + T.getTableName() + " primaryTable LEFT JOIN " +
            schemaName + "." + K.getTableName() +
            " ForeignTable on ForeignTable.id = primaryTable." + T.getForeignFieldName();

        return _connection.Query<T, K, T>(sql, (primary, foreign) =>
        { (primary = T.getForeignFieldName()) = foreign; return primary; });
    }
}

当然,通用解决方案不起作用,我知道sql注入。我只想创建一个通用方法,可以使用Dapper的Query()函数描述的方法


换句话说,您如何编写一个通用函数来实现这一点:

是的,对不起,但以最友好的方式-您已经偏离了保留:-)查询的创建是您指定所需数据以及返回到的对象的时刻。人们使用动态构造的SQL来处理WHERE或ORDERBY子句,但在我看来,这已经完全是一种反模式。通过推迟关于哪些表的最终决定,您得到了一个没有增加任何价值的类。更糟糕的是,您切断了重要的可能性,比如WHERE子句,或者限制了返回的列。在上流社会,从两个连接的表中要求所有行中的所有列被认为有点失礼


故事的寓意是,不要试图写一个可以解决一切问题的查询。编写更多、更小的查询,在需要时及时返回所需内容。

为什么要这样做?考虑使用视图/存储过程……@ Mynne考虑两个重载:一个只返回雇员数据和一个空的人,另一个在查询雇员时返回人数据。现在让它成为通用的。。。。这是太多的视图(许多具有类似结构的表)。而通过查询,我们可以在需要人员数据时调用重载。我明白你的意思。我在帮助一个希望生成的POCO包含一个“GetAll()”方法以返回所有列的人。虽然这是一项简单的任务,但我认为它太重复了,因此提出了一个问题。没问题。我对生成POCO一无所知。谁或什么在生成POCO?如果需要GetAll()方法,它通常位于存储库中,而不是POCO中。POCO的想法是,它是一个有用的T4脚本,通过读取db信息模式进行生成。在创建时让每个生成的POCO都包含一个GetAll(),而不是在以后的阶段编写它们,这样做更简单。我严格反对POCO包含数据库列以外的任何内容,但是嘿!生活很少公平。是的,但POCO将基于您的表,而不是查询。我不打算提及它,但如果在数据库中保留表格,在应用程序中保留对象,这两个世界之间的微妙联系是您的查询,POCO由(我写的免责声明)生成,那么您会更快乐,寿命更长。作为一个愉快的副作用,QueryFirst将消除使用字符串方法动态构建SQL的诱惑:-)
    public IEnumerable<Employee> GetAll(string schemaName)
    {
        var sql = @"SELECT * from " + schemaName + 
            ".Employee primaryTable LEFT JOIN " + 
            schemaName + ".Person ForeignTable "+
            "on ForeignTable.id = primaryTable.person_id";
        return _connection.Query<EmployeeModel, PersonModel, EmployeeModel>
            (sql, (primary, foreign) => { primary.person = foreign; return primary; });
    }
Person {
  int id;
  string Name;
  string address;
  int age;
}

Employee {
  int id;
  int person_id;
  Person person;
  double salary;