5

我有一个函数,它返回一个对象,该对象代表我的数据库中的一条记录以及其他列。我没有为这个对象创建一个单独的类,而是想知道是否还有另一种方法,例如:

public object GetRecord(string key)
{
    var item = select new {column1, column2};

    return item;
}

public void main() 
{
    var item = GetRecord(1);

    //  I want to be able to reference column1 on item.  
    var x = item.column1;  
}
4

5 回答 5

8

是的,还有其他方法(实际上很多),但我强烈建议您不要使用其中任何一种。处理这种情况的最佳选择是创建一个新的自定义类型来保存您拥有的数据。到目前为止,它将是最可维护的选项。

匿名类型专门设计用于在单个方法的范围内使用。您正在与功能设计作斗争,因此很难做到,您很可能会失去 Intellisense,性能很可能会受到影响,并且需要返回并维护代码的可怜的 sap 将不知道发生了什么或如何调整查询。

大多数替代解决方案的主要问题是您丢失了编译时间检查。如果查询删除参数、添加参数、更改类型等。使用它的代码无法知道。编写代码以使用查询时,您无法知道所有数据是什么,它们的类型是什么,变量的名称是什么等。您需要担心编译器可以处理的变量名称中的拼写错误't catch,并且您将始终需要查看生成查询的方法的内部工作原理。您失去了将其视为黑匣子或抽象的能力,这很重要。

如果您担心创建这些自定义类型所花费的时间和精力,可以使用许多自动化工具来根据数据库表或其他来源生成此类类。

于 2012-12-28T18:06:18.867 回答
6

如果是 .net 4.0 使用动态关键字。

public dynamic GetRecord(string key)
{
   var item = select new {column1, column2};

   return item;
}
于 2012-12-28T18:04:25.327 回答
3

此外,如果它是 .net 4.0,您可以使用 a Tuple<object,object>then 引用它item.Item1。您可以使用对象的类型而不是简单的object.

public Tuple<Column1Type,Column2Type> GetRecord(string key)
{
   var item = select new Tuple<Column1Type,Column2Type>(column1, column2);

   return item;
}
于 2012-12-28T18:10:28.543 回答
2

仅补充其他答案,您也可以使用泛型来做到这一点。像这样的东西:

public T GetRecord<T>(string key)
   where T : IAnyInterfaceWithProperties, new
{
   var item = select new T { PropertyOfInterface = value, Property2 = value2 };

   return item;
}
于 2012-12-28T18:07:28.370 回答
1

您可能会考虑为此使用 POCO 库 - 将完全按照您的意愿行事。

您可以自己滚动或使用已经可用的滚动:

http://code.google.com/p/dapper-dot-net/

您的代码将如下所示:

 var result = connection.Query("select col1, col2 from table1");

 var x = result[0].col1;  

Drapper 还可以让你拥有一个强类型,例如:

 var result = connection.Query<myType>("select col1, col2 from table1");

 ' Now result is a list of myType
于 2012-12-28T18:24:00.693 回答