C# Linq Select Rows Where ID Equals ID in CSV

本文关键字:ID Equals CSV in Where Linq Select Rows | 更新日期: 2023-09-27 18:07:13

我所拥有的是我从查询字符串(例如23,51,6,87,29)接收的逗号分隔的id字符串。或者,该字符串可以直接写"all"。

在我的Linq查询我需要一种方式说(在伪代码):

from l in List<>
    where l.Id = all_of_the_ids_in_csv
    && other conditions
select new {...}

我只是不知道该怎么做。我甚至不知道该用谷歌搜索什么才能找到正确的方向。任何指向正确方向的指引都会非常有帮助。

C# Linq Select Rows Where ID Equals ID in CSV

我建议将您的查询分成2部分-第一部分将按ID进行选择,而选择的部分将选择其他条件

首先:检查查询字符串是否包含数字,或者只是all :

var IEnumerable<ListItemType> query = sourceList;
if(queryStringValue != "All")
{
    var ids = queryStringValue.Split(new[] { ',' })
                              .Select(x => int.Parse(x)) // remove that line id item.Id is a string
                              .ToArray();
    query = query.Where(item => ids.Contains(item.Id));
}
from l in query
    // other conditions
select new {...}

因为LINQ查询有延迟执行,你可以构建这样的查询而没有性能缺陷。查询将不会执行,直到您请求结果(通过ToList调用或枚举)。

如果你真的只需要一个LINQ查询:

var idArray = all_of_the_ids_in_csv.Split(',');
from l in List<>
    where (all_of_the_ids_in_csv == "All" || idArray.Contains(l.Id))
    && other conditions
select new {...}

技巧是使用string.Split

var ids = string.split(rawIdString, ",").ToList();
var objects = ids.Where(id=> /*filter id here */).Select(id=>new { /* id will be the single id from the csv */ }); 
// at this point objects will be an IEnumerable<T> where T is whatever type you created in the new statement above