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;