【问题标题】:select column from list从列表中选择列
【发布时间】:2018-03-28 01:19:15
【问题描述】:

我有一个List<string>,其中存储了数据库表列名。

我只需要从 c# linq 查询中选择此列(名称存储在列表中)。

有可能吗?

我试试这段代码,但我不知道如何在选择中放置:

我试试这个代码

items = items.ToList();
            _items.Add(new FieldItem() { FieldName = "field1" });
            _items.Add(new FieldItem() { FieldName = "field2" });
            _items.Add(new FieldItem() { FieldName = "field3" });
            _items.Add(new FieldItem() { FieldName = "field4" });

            _db.Table.Where(a => a.TimeStamp > DateTime.Now.AddHours(-1)).Select(....);

谢谢

【问题讨论】:

  • 是的,这是可能的。给我们你现在尝试过的东西。
  • 包括样本列表、预期输出和您尝试过的内容
  • 请阅读How to Askedit您的问题以包含minimal reproducible example
  • 我认为这是@Gilad Green 的一个错误决定,我同意这是一篇低质量的帖子,而且太无聊了,但对重复内容表示怀疑
  • 另外请解释一下是什么数据库

标签: c# linq select


【解决方案1】:

最后,我使用反射。 在字符串列表中存储属性名称。 通过名称获取属性,并获取它的值。

这样获取一个类的所有PropertyInfo:

PropertyInfo[] propertyInfos;
propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public |
                                              BindingFlags.Static);

当属性名称匹配时,更新属性值:

property.SetValue(child, parentProperty.GetValue(parent));

不是优化的解决方案,但有效。

【讨论】:

    【解决方案2】:

    通过 NuGet 获取 Dapper

    然后在你的代码中使用:

    using Dapper;
    

    你可以走了。您现在需要做的就是(使用您发布的示例):

    using (YourDbContext _db = new YourDbContext())
    {
        return _db.Database.Connection.Query($"SELECT {string.Join(",", _items.Select(if => if.FieldName))} FROM Table WHERE TimeStamp > @TimeStamp;", new { TimeStamp = DateTime.Now.AddDays(-1) });
    }
    

    此方法将返回 IEnumerable,其中包含您的所有字段。结果可以转换为 IDictionary,其中键是您的列名,值是实际值。

    例如,如果我们要使用 First() 获取结果中的第一行,我们可以像这样访问字段值:

    var value = ((IDictionary<string, object>)result.First())["column_name"];
    

    【讨论】:

      猜你喜欢
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 2020-02-10
      • 2012-12-05
      • 1970-01-01
      相关资源
      最近更新 更多