2012-04-03 46 views
2

我有像14,15,18这样的ProjectId列表,我想使用linq从我的数据表中搜索这些项目。如何在LINQ中使用IN运算符

现在我已经创建了像

IEnumerable<DataRow> drProjList = from a in dtProj.AsEnumerable() 
            where a.Field<int>("ProjectId") 
             .ToString() 
             .Contains(projFilter) 
            select a; 

查询,但我没有得到0元素。

任何机构都可以建议我像linq中的IN运算符。

在此先感谢

编辑 projFilter是有14,15,18,......项目IDS纯字符串。

+0

'projFilter'是什么类型? – MarcinJuraszek 2012-04-03 06:59:11

+0

@MarcinJuraszek其逗号分隔的一个字符串ProjectId的 – 2012-04-03 07:10:17

回答

1

我不知道很多有关AsEnumerable(),但我会反过来想这么做,是这样的:

List<int> intProjFilter = new List<int>(); 

foreach(string filter in projFilter.Split(',')) 
     intProjFilter.Add(int.Parse(filter)); 

from a in dtProj 
where projFilter.Contains(a.ProjectID) 
select a; 

让我知道,如果这有助于

+0

但可能没有'.ToString()'。 – 2012-04-03 06:54:44

+0

我以为它在那里,因为projFilter是一个字符串列表。你可能是对的,虽然 – 2012-04-03 06:56:33

+0

嗨@ExitMusic,这个解决方案适用于我,但它也返回14,8,18和14,15,18:( – 2012-04-03 07:04:59

0

或许真的像这样:

IEnumerable<DataRow> drProjList = 
         (
          from a in dtProj.AsEnumerable() 
          where projFilter.Contains(a.Field<int>("ProjectId").ToString()) 
          select a; 
         ) 

或者你可以简单地这样做,以及:

IEnumerable<DataRow> drProjList=dtProj.AsEnumerable() 
            .Where(a=>projFilter 
              .Contains(a.Field<int>("ProjectId") 
              .ToString())); 
+0

,这显示错误,“最好的重载方法的字符串.Contains(字符串)有一些无效的论点。” 我认为'a.Field (“ProjectId”)''需要'ToString()'??? – 2012-04-03 07:15:42

+0

更新答案 – Arion 2012-04-03 07:19:02

+0

嗨@ Arion,感谢您的快速回复。我得到的ExitMusic的查询返回一样。我将如何避免那些额外的1,4,8 ProjectIds? – 2012-04-03 07:27:57

0

我不知道c#所以我想在vb.net给出答案,希望能帮助你。

Dim dtProj As DataTable 
    dtProj = FillProjectList() 

    Dim projIdFilter() As Integer = {14, 15, 16} 

    Dim drRow = From p In dtProj.AsEnumerable _ 
     Where projIdFilter.Contains(p.Field(Of Integer)("ProjectId")) _ 
     Select p 

谢谢...

3

字符串的 “包含” 是不是真的在这里的选项。您应该首先将projFilter转换为适当的整数列表。

var projFilter2 = new HashSet<int>(projFilter.Split(',').Select(i => int.Parse(i))); 

只有然后检查它是否包含所需的数字。

IEnumerable<DataRow> drProjList = 
    from a in dtProj.AsEnumerable() 
    where projFilter2.Contains(a.Field<int>("ProjectId")) 
    select a; 
1

您需要首先将项目过滤器解析为整数集合。

var projectIds = projFilter.Split(',').Select(x => Convert.ToInt32(x)).ToList(); 

var drProjList = 
    from a in dtProj.AsEnumerable() 
    where projectIds.Contains(a.ProjectId) 
    select a; 
+0

oops修正了一个错字,假设是ToList()而不是ToString() – Fnop 2012-04-03 08:32:53