【问题标题】:Linq query without column names没有列名的 Linq 查询
【发布时间】:2019-03-07 10:09:21
【问题描述】:

我正在尝试通过在检索到的列表上使用 Select OR Where 子句来编写 LINQ 查询。但是,该列表没有列名,只有值。 所以我的问题是如何根据这个条件获取值?

例如该列表包含 Approved、OnHold 状态。但是,我只想从列表中获取“已批准”状态的记录。 下面是我的代码

SpreadsheetsResource.ValuesResource.GetRequest request = service.Spreadsheets.Values.Get(spreadsheetId, range);

ValueRange response = request.Execute();
IList<IList<object>> values = response.Values;

下面是列表中值的截图

名称为“values”的列表包含所有记录。

对此的任何帮助将不胜感激!

【问题讨论】:

    标签: c# linq asp.net-core


    【解决方案1】:

    您的数据将作为集合返回,因此您可以通过其数字索引访问属性,例如

    var approvedResults = values.Where(c =&gt; c[7] == "Approved");

    或者您可以将其映射到适当的对象,例如

    public class MyResultObject {
       public DateTime date {get; set;}
       public string FirstName {get; set;}
       ...
       public string ApprovedStatus {get; set;}
    
       public MyResultObject(string[] values)
       {
           date = DateTime.Parse(values[0]);
           FirstName = (string) values[1];
           ...
           etc.
       }
    }
    

    然后用linq把你的数据转成一堆,这样会好很多。

    var myResultObjects = values.Select(c => new MyResultObject(c.Select(x => (string)x).ToArray());
    

    您可能需要调整一些代码,因为我不知道 ValueRange 的确切工作原理,我只是在没有检查的情况下输入了它,但这就是要点。

    然后你可以做myResultObjects.Where(c =&gt; c.ApprovedStatus == "Approved"); 更好。

    【讨论】:

    • 通过使用 var approvedResults = values.Where(c => c[7] == "Approved");它作为索引超出范围异常给出错误
    • 我的猜测是您的某些记录没有返回所有 8 列数据。您应该检查数据质量。实际上,您可以在屏幕截图中看到,其中一些为Count = 9,另一种为Count = 8。如果您有一条计数小于 8 的记录,则会导致此错误,因为在 [7] 处没有要读取的列。
    • 是的..刚刚在调试时发现..但是我对即将到来的数据没有任何控制..那么我们如何检查呢?
    • 如果数据没有Approved的列,那么如何检查它是否被批准?
    • 您可以过滤,只需执行values.Where(c =&gt; c.Length &gt; 7 &amp;&amp; c[7] == "Approved");。不过,事先有另一个步骤来清理数据可能会更好,也许会删除无效条目。
    【解决方案2】:

    我通过使用下面的代码行实现了这一点

    var result = values.Where(x => x.Contains("Approved")).ToList();
    

    这只会给我“已批准”状态的记录。

    谢谢!

    【讨论】:

    • 那么,x 不是你的数组吗?所以它正在搜索每个值......如果您有一个姓氏Approved 的人,那么即使状态未获批准,它也会匹配。因此,它不会为您提供已批准状态的记录,它会为您提供任何包含“已批准”字样的列的任何内容......此外,检查每一列并不是很有效。
    • @NibblyPig 是的 同意这个!会根据你的回答改变
    猜你喜欢
    • 2010-09-05
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多