【发布时间】:2017-08-22 09:04:20
【问题描述】:
我有一个分层结构的对象列表。我想根据客户公司设置并存储在数据库中的“条件”针对该对象列表构建复杂的 LINQ 查询。所以我需要在运行时构建它们,但是因为每当客户端的用户更新或刷新他们的数据时它们都会重复运行,所以我想将 LINQ 查询存储在对象中,而不是每次都重新构建它们。
我看过 ScottGu 关于Dynamic LINQ 的博客。
还有这篇关于使用expression trees的文章。
这些似乎都没有提供足够的解决方案,但我可能没有充分理解它们。恐怕我应该考虑其他选项时尝试使用 LINQ。
我的对象层次结构:
WorkOrder[]
Field[]
Task[]
Field[]
这是一个我想存储和执行的 LINQ 查询示例。我可以根据定义条件的数据库记录合理地构建这种格式。
var query =
from wo in WorkOrders
from woF in wo.Fields
from task in wo.Tasks
from taskF in task.Fields
from taskF2 in task.Fields
where woF.Name == "System Status"
&& woF.Value.Contains("SETC")
&& taskF.Name == "Material"
&& taskF.Value == "Y"
&& taskF2.Name == "Planner"
&& taskF2.Value == "GR5259"
select new
{
wo_id = wo.ID,
task_id = task.ID
};
一些注意事项。
- 根据用户定义条件的复杂性,我可能需要也可能不需要从不同的对象列表中提取:“froms”是动态的。
- 请注意,在此示例中,我从 task.fields[] 中提取了两次,因此我为它设置了两次别名。
- 示例 LINQ 结构允许我使用复杂的 AND、OR、括号等,我认为这些对于动态链接或表达式树是不实用的。
在我的代码中我设想:
//1) Retrieve business rules from DB. I can do this.
//2) Iterate through the business rules to build the linq queries.
foreach (BusinessRule br in BusinessRules) {
//Grab the criteria for the rule from the DB.
//Create a linq to object query based on the criteria just built.
//Add this query to a list for later use.
}
...Elsewhere in application.
//Iterate through and execute the linq queries in order to apply business rules to data cached in the application.
foreach (LinqQuery q in LinqQueries) {
//Execute the query
//Apply business rule to the results.
}
非常感谢您的想法、努力和想法。
【问题讨论】:
-
“将它们存储在对象中”是什么意思?存储什么?查询的结果?使用缓存。表达方式?你会储存什么?这是一种表达。您是说要动态撰写查询吗?
-
感谢您的提问。理想情况下,当应用程序开始时,我可以动态构建所需的 LINQ 查询并将它们存储在静态类中,然后引用它们以供重复使用。我的 WorkOrder 对象列表会经常更改,我想针对它执行 LINQ 查询,以便针对这些特定对象执行业务规则。
-
明确一点:我想存储 LINQ 查询定义,而不是结果。
-
您的查询对象是存储的 LINQ 查询。 “商店”到底是什么意思?
-
您尝试过 PredicateBuilder 吗? albahari.com/nutshell/predicatebuilder.aspx
标签: c# linq linq-to-objects dynamic-linq