C# 基于C列表的动态SQL查询(基于字符串)

C# 基于C列表的动态SQL查询(基于字符串),c#,sql,C#,Sql,我试图找到一种使用字符串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> tu

我试图找到一种使用字符串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。 它需要支持对指定列的提取,就像SQL select column1、column2。。。 我没有SQL服务器,我没有额外的mdf数据库,它只是客户对象的列表,有什么方法可以做到吗


我这样做的动机是能够将此列表中的特定信息提取到二维表格中,并将其输出到excel,但行和列筛选不是预定义的,需要多行操作,用户将能够像SQL查询一样指定要提取的确切信息。

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

items.Select(c => c.Customer)
对内存中的对象执行此操作时,您使用的是LINQ to对象


与编写SQL to objects框架相比,我更喜欢这样。这听起来像是一场真正的维护噩梦。

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

items.Select(c => c.Customer)
对内存中的对象执行此操作时,您使用的是LINQ to对象


与编写SQL to objects框架相比,我更喜欢这样。这听起来像是一场真正的维护噩梦。

也许这就是你想要的

 List<Tuple<string,int>> tuples = customers.Select(x => Tuple.Create(x.Name,x.Age)).ToList();

也许这就是你想要的

 List<Tuple<string,int>> tuples = customers.Select(x => Tuple.Create(x.Name,x.Age)).ToList();

你有没有考虑过用同样的方法来构建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,您可以推迟内存中的内容,直到您完成添加条件。

您是否考虑过以与构建字符串相同的方式构建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,您可以将内存中的内容推迟到添加完条件后再执行。

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

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

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


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

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

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

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


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

“将对象视为DB”的确切含义是什么?不能使用sql字符串查询列表集合,这是胡说八道。你到底为什么要这样做?这个想法是,这个列表是一个小数据库,我需要从中提取特定的值,就像查询数据库一样。到目前为止,linq听起来像是一个解决方案,但我将执行的查询是动态的,linq不支持。离题建议:我可能会存储出生日期而不是年龄,因为年龄取决于代码执行的时间,以及对象在内存中的停留时间。当代码在除夕/元旦前后运行时会发生什么情况…?DateOfBirth独立于所有这些,并且可以随时从中轻松得出正确的年龄。我明白你的意思,但使用客户。选择c=>new object[]{c.Name,c.Age}.ToArray;硬编码不是吗

动态这不是我想要的。你说的“将对象视为DB”到底是什么意思?你不能使用sql字符串查询列表集合,这是胡说八道。你到底为什么要这样做?这个想法是,这个列表是一个小数据库,我需要从中提取特定的值,就像查询数据库一样。到目前为止,linq听起来像是一个解决方案,但我将执行的查询是动态的,linq不支持。离题建议:我可能会存储出生日期而不是年龄,因为年龄取决于代码执行的时间,以及对象在内存中的停留时间。当代码在除夕/元旦前后运行时会发生什么情况…?DateOfBirth独立于所有这些,并且可以随时从中轻松得出正确的年龄。我明白你的意思,但使用客户。选择c=>new object[]{c.Name,c.Age}.ToArray;硬编码不是动态的。。。这不是我想要的。我知道linq,问题是我有动态查询,字符串,据我所知,linq不能解析我的查询,我必须自己做,有没有其他方法,而不是基于类型的?如果你有一个特定的动态查询需要实现,你应该在你的问题中包括这一点。您的问题是“如何使用LINQ实现此查询”,而不是“如何将我的列表视为数据库”。我知道LINQ,问题是我有动态查询、字符串,据我所知,LINQ无法解析我的查询,我必须自己做,是否有其他方法,而不是基于类型?如果您需要实现特定的动态查询,你应该在你的问题中包括这一点。您的问题是“如何使用LINQ实现此查询”,而不是“如何将列表视为数据库”。这还不够,我真正想要的是sql行为,因为返回的元组需要截断为选定的列。。。thanks@Kaleldar理解。您可以使用反射生成具有适当属性的匿名类型,否则,请编写一个方法,使用lambda指定所需属性并返回字典或类似内容。这并不理想,在调用方法时仍然需要一个开关,但它可以工作。比如Dictionary=GetTuplesresults,x=>x.Name,y=>y.age这还不够,我真正想要的是sql行为,因为返回的元组需要被截断到所选的列中。。。thanks@Kaleldar理解。您可以使用反射生成具有适当属性的匿名类型,否则,请编写一个方法,使用lambda指定所需属性并返回字典或类似内容。这并不理想,在调用方法时仍然需要一个开关,但它可以工作。比如Dictionary=GetTuplesresults,x=>x.Name,y=>y.age嗨,谢谢,离我要找的东西足够近了,非常感谢:,干杯!嗨,谢谢,离我要找的足够近了,非常感谢:,干杯!