【问题标题】:Dynamic expression in linqlinq 中的动态表达式
【发布时间】: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


【解决方案1】:

也许PredicateBuilder 就是您要找的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多