允许用户在对象上定义类似WHERE的约束的最佳方法是什么:
Collection<object[]> data
Collection<string> columnNames
其中object []是一行。
我在考虑动态创建一个强类型的包装器,并且只使用动态LINQ,但是可能有一个更简单的解决方案?
DataSet并不是一个真正的选项,因为集合相当庞大(40,000多条记录),我不想创建DataTable并在每次运行查询时填充它。
答案 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。
所以,如果我说得对,你真正想要的是:
对于此任务,我建议: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查询引擎。
完美。