动态“WHERE”类似于对内存对象的查询

时间:2009-03-26 09:38:33

标签: c# .net linq

允许用户在对象上定义类似WHERE的约束的最佳方法是什么:

Collection<object[]> data
Collection<string> columnNames

其中object []是一行。

我在考虑动态创建一个强类型的包装器,并且只使用动态LINQ,但是可能有一个更简单的解决方案?

DataSet并不是一个真正的选项,因为集合相当庞大(40,000多条记录),我不想创建DataTable并在每次运行查询时填充它。

6 个答案:

答案 0 :(得分:4)

您需要运行哪些类型的查询?如果它只是平等,那就相对容易了:

public static IEnumerable<object[]> WhereEqual(
    this IEnumerable<object[]> source,
    Collection<string> columnNames,
    string column,
    object value)
{
    int columnIndex = columnNames.IndexOf(column);
    if (columnIndex == -1)
    {
        throw new ArgumentException();
    }
    return source.Where(row => Object.Equals(row[columnIndex], value);
}

如果您需要更复杂的内容,请向我们举例说明您喜欢的内容。

答案 1 :(得分:1)

如果我明白你的观点:你想支持用户在外部写where子句 - 我的意思是用户是真正的用户,而不是开发人员,所以你寻求uicontrol的解决方案,条件桥接的代码。我只是因为你提到了dlinq。


所以,如果我说得对,你真正想要的是:

  • 授予用户使用列名称的能力
  • 能够描述bool函数(将作为标准的位置)
  • 动态撰写查询并运行

对于此任务,我建议:System.Workflow.Activities.Rules命名空间中的规则。对于规则,有几个设计师可用,更不用说Visual Studio附带的那些(对于网络来说这是另一个问题,但也有几个问题)。我将从Rules without workflow开始,然后检查来自MSDN。它是一个非常灵活和可定制的引擎。

另一件事:LINQ与此问题有关,因为返回IQueryable的函数可以推迟查询执行,您可以预先定义查询,在代码的另一部分可以根据用户的条件扩展返回的可查询(然后可以坚持使用扩展方法)。

答案 2 :(得分:0)

当使用object时,LINQ并不会真的对你有所帮助......值得痛苦吗?而动态LINQ肯定是矫枉过正。使用它的预期方式是什么?我可以想到添加基本Where操作的几种方法......但我不确定它会有多大帮助。

答案 3 :(得分:0)

如何在项目中嵌入IronPython之类的内容?我们使用它来允许用户在沙箱中定义自己的表达式(过滤器和其他)。

答案 4 :(得分:-1)

我正在考虑这样的事情:

((col1 =“abc”)或(col2 =“xyz”))和(col3 =“123”)

最终,使用%wildcard支持LIKE运算符会很好。

答案 5 :(得分:-1)

谢谢大家 - 我终于找到了它。它叫做NQuery,它可以从CodePlex获得。在其文档中甚至有一个示例,其中包含对我的结构的绑定 - 列名列表+对象列表[]。加上功能齐全的SQL查询引擎。

完美。