【发布时间】:2011-11-22 05:43:52
【问题描述】:
我正在尝试创建一个库,我可以在其中指定 xml 文件中的查询参数和运算符,并且在运行时我可以基于 xml 文件生成 linq 表达式。我让它仅用于构建“where”表达式,例如 select * from table where table.id = 1 等简单查询。这是 xml 文件中的简单查询示例:
<query name="latest">
<PropertyValue PropertyName="TimeStamp" OperatorName="GreaterThanOrEqual" ParamName="lastUpdated" />
</query>
TimeStamp 属性名称是要使用的 C# 类中的属性名称。 ParamName 是来自我的 asp.net 应用程序中的 http 请求的 url 参数。 在代码中,我可以从中构建 linq 表达式并制作以下 where 子句:
(IQueryable<DataObject>)dataObjects.Where(expression);
表达式在哪里:
TimeStamp >= "2011-09-21T11:54:24"
但我需要处理一种新型查询:
select * from theTable t where Id=(select top 1 Id from theTable 其中 Source=t.Source order by Id desc)
此查询在具有 Id 字段和 Source 字段的表上运行。查询返回每个源的最新条目。因此,它按来源分组并按降序排列,并返回每个来源的第一个条目。然后外部选择返回内部选择中每个结果的所有列。示例:
表:
id source field3 field4
1 Device1 test test
2 Device2 test2 test2
3 Device1 test3 test3
4 Device2 test4 test4
查询结果:
id source field3 field4
3 Device1 test3 test3
4 Device2 test4 test4
所以现在我需要在 where 子句中动态生成一个嵌套查询。我想我的第一个问题是字符串查询可以转换为 linq 查询吗?然后我需要能够以某种方式动态构建该嵌套查询..对不起,如果它没有多大意义......
【问题讨论】:
-
你可能想看看动态查询库:weblogs.asp.net/scottgu/archive/2008/01/07/…
-
请注意,提到的 LINQ 库相对较旧(如被动)。它仍然适用,但是(IMO)它的某些部分会更好地使用表达式树检查(我想)不存在 - 在那个程度上 - 在这些 .NET 3.5 天。
标签: asp.net linq sql-server-2008 c#-4.0 entity-framework-4