【问题标题】:Dynamically refer to Entity Framework columns in IQueryable<T>动态引用 IQueryable<T> 中的实体框架列
【发布时间】:2019-11-13 23:13:33
【问题描述】:

我知道一些类似的问题在堆栈溢出中徘徊,但是尽管它们似乎都没有按照我想要的方式工作。这是我想要实现的想法:

// arrays vary depends what's in bigger loop
string[] columnNames = {"id", "name", "surname", "address", "phone"} 

// ...

foreach (string columnName in columnNames)
{
    if (condition)
    {
        IQueryable<tableType> query = from x in dbContext where x.(**columnName**).contains(otherVariable) select x;
    }
    // ...
    // Another queries wrapped in if conditions
}

我已经用我在这里找到的 typeof() 和 Type.GetProperty() 进行了尝试,但它似乎没有任何作用。另一件事是我希望这尽可能符合当前最佳实践的标准,如果我正在寻找错误的方向,那么我应该指向哪里?我需要让这种方法可重用于数以百计的视图和表。

干杯,

【问题讨论】:

  • 检查这个答案:stackoverflow.com/a/24732863/12258072 他们使用反射 (GetType().GetProperty(columnName).GetValue(x)) 来动态访问这些值。
  • 这个解决方案的问题是它只需要有问题的特定列的值,而我需要通过将 WHERE 条件应用于该列来从 IQueryable 中提取数据以进行进一步的条件查询,如果这有任何意义( ?)
  • 不确定我是否理解这一点,但是您可能只是将查询存储到按列名索引的字典中,这样您就可以对每一列进行查询,然后可以进一步细化。跨度>
  • 这不是仅通过变量名提取列的数据的问题,而是通过变量名将 where 子句应用于没有强类型列名的列。在这个项目中可能有数以万计的列名,它是我感兴趣的包含/相等字符串子句。但最后我必须选择整个表。

标签: c# entity-framework


【解决方案1】:

您应该存储表达式,而不是在数组中存储字符串。

Expression<Func<TableType, bool>>[] conditions = new {
    x => x.ID > 5,
    x => x.Name > "M" };

等等。 比你可以查询

var query = dbContext.YourTable.Where(conditions[1])

这比使用反射或动态等更简单易读。

您也可以通过多个 where 子句组合多个条件。

由于您的示例暗示了 where 子句,我不得不在这里发明一些布尔表达式。

不要从存储字符串开始(除非这些字符串是用户输入的)

【讨论】:

  • 它可能看起来更简单和容易,但是虽然此时我不知道列名是什么,因此我不能强烈地输入条件。
  • 所以您的 IQueryable 不是已知类型?您的源示例从定义为常量的列名开始!您是使用 LINQ to 对象还是 LINQ to SQL,因为 SQL 的 Contains 方法需要是一个列表,而整个 Condition 需要是一个表达式。所以表达式列表需要在某个地方构建。我不确定您是否要在您的条件下使用 List.Contains 或 String.Contains。
【解决方案2】:

我必须通过 @Aleks Andreev

回答的另一篇帖子的链接来回答我的问题

LINQ where condition with dynamic column

这正是我想要的。

【讨论】:

    猜你喜欢
    • 2014-04-22
    • 2021-05-15
    • 2011-07-15
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多