1

我试图找到一种使用字符串 sql 查询将 C# 列表作为数据库进行查询的方法,例如:

List<Customer> customers = new List<Customer>(){
    new Customer(){Name = "joe", Age = 20},
    new Customer(){Name = "john", Age = 25}
};
string query = @"Select * from customers";
List<Tuple> tuples = EntityDB.query(customers, query);
Console.Writeline(tuples[0][0]); //prints "joe"

我有几个需要使用此功能来满足的要求,

  • 它需要支持动态 SQL 查询(字符串查询),因为我需要从这个列表中提取特定的行,并且过滤不是预定义的。(linq 在这里没有帮助)
  • 它需要能够像 SQL 一样支持多行的功能(如 Average、Count...)。
  • 它需要支持与 SQL 完全一样的指定列的提取(选择 column1、column2...)

我没有 SQL 服务器,我没有额外的 mdf DB,它只是这个客户对象列表,有没有办法做到这一点?

我这样做的动机是能够从此列表中提取特定信息到二维表并将其输出到 excel,但是行和列过滤没有预定义,并且需要多行操作,用户将能够指定确切的他们想要像 SQL 查询一样提取的信息。

4

4 回答 4

4

LINQ 允许您对各种数据源(数据库、XML 文件、应用程序对象)执行类似查询的命令。您可以使用 LINQ 非常轻松地从列表中选择项目:

items.Select(c => c.Customer)

当对内存对象执行此操作时,您正在使用 LINQ-to-Objects。

我更喜欢这个而不是编写一个 SQL 到对象的框架。这听起来像是一场真正的维护噩梦。

于 2012-08-25T22:20:23.753 回答
1

您是否考虑过以与构建字符串相同的方式构建 Linq?

就像是

var customers = new List<Customer> { … };
IQueryable<Customer> results = customers.AsQueryable();


if(!string.IsNullOrEmpty(CustomerName))
    results = results.Where(x => x.Name = CustomerName);

if(CustomerMaxAge != 0)
    results = results.Where(x => x.Age <= CustomerMaxAge);

//etc....

return results.ToList();

通过使用,IQueryable您可以推迟内存中的内容,直到您完成添加条件。

于 2012-08-25T23:21:37.470 回答
1

与其尝试在代码中模拟数据库,您是否考虑过使用轻量级数据库来解决您的问题?想到 SQLite 之类的东西。通常它会将文件写入磁盘,但实际上也支持在内存中加载。

根据文档,内存中的 SQLite 数据库不需要将文件写入磁盘,并且在您打开连接时存在于内存中。一旦连接关闭,它就不再存在。

http://www.sqlite.org/inmemorydb.html

打开连接后,您可以像使用常规 SQL 字符串查询任何其他数据库一样查询数据,或者如果您愿意,可以使用带有 NHibernate 的 LINQ 或其他一些受支持的 ORM 查询数据。

SQLite 专为您需要 SQL 的强大功能但无需设置完整数据库服务器的开销而设计。事实上,如果您使用 Firefox 作为浏览器,那么您现在正在使用 SQLite ;)

于 2012-08-26T11:08:33.437 回答
0

也许这就是你想要的?

 List<Tuple<string,int>> tuples = customers.Select(x => Tuple.Create(x.Name,x.Age)).ToList();
于 2012-08-25T22:39:29.900 回答