【问题标题】:Looping through Linq query循环通过 Linq 查询
【发布时间】:2014-04-24 14:27:31
【问题描述】:

我有一个 linq 查询,它从 odata 服务中提取数据,如下所示:

var Query = from t in results.People
   where t.Invalid == false && t.Id == 148
   select new
   {
    t.Name,
    t.Location
   }

我还有一个 ID 为 {148,149,150...} 的字符串数组,我想用数组中的每个 ID 替换上面的 t.Id == 148 表达式。

我不确定它的语法是怎样的,如果它甚至可能没有 for 循环。 有人可以告诉我是否可能吗?

【问题讨论】:

  • 您的列表很大吗?你可以看到这个答案stackoverflow.com/questions/3521346/…
  • 不大,大概30条左右。
  • 然后转到我上面链接的答案,并通过连接执行 $filter 答案以将其发送到 odata 服务器。

标签: c# linq odata


【解决方案1】:

对于 OData,您可以尝试:

var Query = from t in results.People
            from r in ids
            where t.Invalid == false && t.Id = r
            select new
            {
                t.Name,
                t.Location
            };

这将返回数组ids中具有匹配ID的所有行

对于 LINQ to 对象或 LINQ to SQL/Entity 框架,查询通常是:

var Query = from t in results.People
   where t.Invalid == false && ids.Contains(t.Id)
   select new
   {
    t.Name,
    t.Location
   };

【讨论】:

  • 我不相信 OData 支持包含。
  • 正确。我得到cannot convert from 'long[]' to 'System.Linq.IQueryable<long?>。但是有没有办法创建一个看起来像t.Id == 148 || t.Id == 149 等的动态字符串?对于数组中的所有值?
  • 嗯,现在我在尝试像 foreach (var detail in Query) { name = detail.Name; location = detail.Location; } 那样迭代查询变量时得到 The method 'Select' is not supported.
  • @sd_dracula,你能尝试几件事吗?首先创建一个临时类,然后投影到它的属性,如select new MyClass { Name = t.Name, Location = t.Location},而不是匿名类型。我相信这应该可行,您也可以尝试使用匿名类型明确指定字段名称,例如 select new { Name= t.Name, Location = t.Location}
  • 我也收到了类似的错误:{Error translating Linq expression to URI: The method 'Select' is not supported.}
【解决方案2】:

如果 OData 不支持包含,那么 Any 呢?

from t in results.People
where t.Invalid == false && ids.Any(id => id == t.Id)
select new
{
    t.Name,
    t.Location
};

【讨论】:

    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多