Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “动态”;其中;类似于对内存对象的查询_C#_.net_Linq - Fatal编程技术网

C# “动态”;其中;类似于对内存对象的查询

C# “动态”;其中;类似于对内存对象的查询,c#,.net,linq,C#,.net,Linq,允许用户在如下定义的对象上定义类似WHERE的约束的最佳方法是什么: Collection<object[]> data Collection<string> columnNames 收集数据 集合列名称 其中,对象[]是一行 我在考虑动态创建一个强类型的包装器,只使用动态LINQ,但也许有一个更简单的解决方案 DataSet不是一个真正的选项,因为集合相当大(40000多条记录),我不想每次运行查询时都创建DataTable并填充它。您需要运行哪种查询?如果只是平等

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

Collection<object[]> data
Collection<string> columnNames
收集数据
集合列名称
其中,对象[]是一行

我在考虑动态创建一个强类型的包装器,只使用动态LINQ,但也许有一个更简单的解决方案


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

您需要运行哪种查询?如果只是平等,那就相对容易:

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);
}
公共静态IEnumerable,如果相等(
这是一个数不清的来源,
集合列名称,
字符串列,
对象值)
{
int columnIndex=columnNames.IndexOf(column);
如果(columnIndex=-1)
{
抛出新ArgumentException();
}
返回source.Where(行=>Object.Equals(行[columnIndex],值);
}

如果您需要更复杂的内容,请给我们一个您希望能够编写的示例。

当仅使用
对象时,LINQ并不会对您有多大帮助…它值得您付出痛苦吗?而动态LINQ无疑是过火了。使用它的预期方式是什么?我可以想出一些添加基本的方法e> 其中
操作……但我不确定这会有多大帮助。

我在想这样的事情:

Collection<object[]> data
Collection<string> columnNames
((col1=“abc”)或(col2=“xyz”)和(col3=“123”)


最终,支持带有%通配符的LIKE运算符会很好。

在您的项目中嵌入LIKE运算符怎么样?我们使用它来允许用户定义自己的表达式(过滤器等)沙箱内部。

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


所以如果我是对的,你想做的是:

  • 允许用户使用列名
  • 提供描述布尔函数的能力(将作为where标准)
  • 动态组合查询并运行
对于这项任务,让我建议:来自System.Workflow.Activities.Rules命名空间的规则。对于规则,有几个可用的设计器,更不用说Visual Studio附带的设计器了(对于web,这是另一个问题,但也有几个用于此的设计器).我先从msdn开始,然后再看它的例子。它是一个非常灵活和可定制的引擎


另一件事:LINQ与此问题有关,因为返回IQueryable的函数可以延迟查询执行,您可以预先定义查询,并且在代码的另一部分中,可以根据用户的条件扩展返回的queryable(然后可以使用扩展方法将其粘贴).

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


完美极了。

(这不应该在问题中,而不是作为答案吗?)