C#Linq选择ID等于CSV的行ID

时间:2013-04-03 19:36:11

标签: c# sql-server linq csv

我所拥有的是一串逗号分隔的ID,我从查询字符串(例如23,51,6,87,29)收到这些ID。或者,该字符串可以说“全部”。

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

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

我只是不确定如何去做。我甚至不确定谷歌会让我朝着正确的方向前进。任何指向正确方向的人都会非常有帮助。

3 个答案:

答案 0 :(得分:3)

我建议将您的查询拆分为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调用或枚举)之前,不会执行查询。

答案 1 :(得分:0)

如果你真的只想要一个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 {...}

答案 2 :(得分:0)

诀窍是使用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