返回linq查询的数据类型

本文关键字:数据类型 查询 linq 返回 | 更新日期: 2023-09-27 17:49:42

我有一个函数,它返回一个对象,该对象表示数据库中的一条记录和附加列。而不是为这个对象创建一个单独的类,我想知道是否有另一种方式,例如:

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;  
}

返回linq查询的数据类型

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

匿名类型是专门为在单个方法范围内使用而设计的。你在与功能的设计作斗争,所以很难做到,你很可能会失去智能感知,性能很可能会受到影响,需要回来维护代码的可怜的sap将不知道发生了什么,也不知道如何调整查询。

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

如果您担心创建这些自定义类型所花费的时间和精力,那么有许多自动化的工具专为基于数据库表或其他源生成这些类而设计。

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

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

如果它是。net 4.0,你可以使用Tuple<object,object>,然后通过item.Item1引用它。您可以使用对象的类型,而不是简单的object

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

除了补充其他答案外,您还可以使用泛型来完成此操作。像这样:

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

您可以考虑为此使用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