【问题标题】:LINQ To SQL Dynamic SelectLINQ To SQL 动态选择
【发布时间】:2010-06-07 14:05:15
【问题描述】:

谁能告诉我如何指出我希望在运行时从 LINQ To SQL 语句返回哪些列?

我允许用户在复选框列表中选择项目,该复选框表示他们希望在绑定到 L2S 查询结果的网格视图中显示的列。

我能够动态生成 W​​HERE 子句,但无法对 SELECT 片段执行相同操作。这是一个示例:

var query = from log in context.Logs select log;
                query = query.Where(Log => Log.Timestamp > CustomReport.ReportDateStart);
                query = query.Where(Log => Log.Timestamp < CustomReport.ReportDateEnd);
                query = query.Where(Log => Log.ProcessName == CustomReport.ProcessName);

                foreach (Pair filter in CustomReport.ExtColsToFilter)
                {
                    sExtFilters = "<key>" + filter.First + "</key><value>" + filter.Second + "</value>";
                    query = query.Where(Log => Log.FormattedMessage.Contains(sExtFilters));
                }

【问题讨论】:

标签: c# asp.net linq-to-sql


【解决方案1】:

简短的回答是不要

一个方法必须有一个已知的、特定的返回类型。该类型可以是System.Object,但是您必须使用很多丑陋的反射代码才能真正获取成员。而且在这种情况下,您还必须使用很多丑陋的 reflection 表达式树代码来生成返回值。

如果您尝试在 UI 端动态生成列 - 请停止这样做。在设计时定义列,然后简单地显示/隐藏您实际需要/希望用户看到的列。让您的查询返回所有可能可见的列。

除非您注意到选择所有数据列存在严重的性能问题(在这种情况下,您可能在数据库级别存在非覆盖索引问题),否则使用这种方法会好得多。动态生成谓词和排序顺序非常好,但您真的不想对输出列表执行此操作。


一些 cmets 迫使我认真考虑我是否正确地暗示动态输出列表实际上是可能的,我得出的结论是,尽管它是一个危险的游泳反对当前的想法。为了完成这个特技,你必须:

  1. 使用Reflection.Emit 生成新类型。
  2. 生成一个表达式树,使用Expression.MemberInit对其进行初始化。
  3. 编译表达式并将其传递给Select 方法。
  4. 从您的方法中返回弱类型 System.Object,并使用反射按名称访问成员。

这不是我希望在生产代码中看到的那种东西,但你有它 - 这是可能的。

【讨论】:

  • 嗯,这不是我要找的答案,你提出了一个有趣的观点。
  • L2S 甚至 可能 吗? L2S 中用于自定义选择的匿名类型都是编译时生成的;如果这甚至可以作为一项智力练习来完成,我会感到惊讶。
  • @Adam:如果您为Select 动态构建表达式树,理论上是可行的。我说理论上是因为我没有尝试过,我也不会。;)
  • @Aaronaught,确实有可能,使用Expression.MemberInit 方法。但是,此方法需要 TypeConstructorInfo,因此您必须在运行时动态创建类型
  • @Aaronaught:确实。现在,对于我的下一个技巧,我将使用强类型 ORM 工具来执行完全动态的(在条件和结果中)查询!
【解决方案2】:

您不需要在查询级别执行此操作(无论如何这将非常困难,因为您需要在运行时动态创建一个类型)...在 GridView 本身中处理它要容易得多,通过明确声明要显示的列。

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多