LINQ中的Where IN子句

188

如何制作类似于 SQL Server 的 where in 子句?

我已经自己制作了一个,但是有没有人可以优化一下?

    public List<State> Wherein(string listofcountrycodes)
    {
        string[] countrycode = null;
        countrycode = listofcountrycodes.Split(',');
        List<State> statelist = new List<State>();

        for (int i = 0; i < countrycode.Length; i++)
        {
            _states.AddRange(
                 from states in _objdatasources.StateList()
                 where states.CountryCode == countrycode[i].ToString()
                 select new State
                 {
                    StateName  = states.StateName                    

                 });
        }
        return _states;
    }
8个回答

314

这个表达式应该能够实现你想要的目标。

dataSource.StateList.Where(s => countryCodes.Contains(s.CountryCode))

12
这将比较字符串值,但ID呢? - Jitendra Pancholi
1
@JitendraPancholi 如果你创建一个 List<int>,你可以检查 id。它在 .Net 4 中得到支持。不确定之前的版本。 - Rashmi Pandit

110

这将转换为 Linq to SQL 中的 where in 子句...

var myInClause = new string[] {"One", "Two", "Three"};

var results = from x in MyTable
              where myInClause.Contains(x.SomeColumn)
              select x;
// OR
var results = MyTable.Where(x => myInClause.Contains(x.SomeColumn));

针对你的查询,你可以像这样做...

var results = from states in _objectdatasource.StateList()
              where listofcountrycodes.Contains(states.CountryCode)
              select new State
              {
                  StateName = states.StateName
              };
// OR
var results = _objectdatasource.StateList()
                  .Where(s => listofcountrycodes.Contains(s.CountryCode))
                  .Select(s => new State { StateName = s.StateName});

谢谢;) 也帮助了我 +1 - Thiago Loureiro

51

我喜欢将其作为扩展方法:

public static bool In<T>(this T source, params T[] list)
{
    return list.Contains(source);
}

现在你可以调用:

var states = _objdatasources.StateList().Where(s => s.In(countrycodes));

您也可以传递单个值:
var states = tooManyStates.Where(s => s.In("x", "y", "z"));

感觉更自然,更接近SQL。


2
我应该在哪里编写这个扩展方法? - RobertKing
@Rohaan,在任何静态类(非泛型且非嵌套)中 - nawfal
1
只有在你需要重复使用linq中的Where In部分时才有写扩展类的必要。我已经点赞了这个答案,但是想让其他人注意,不要直接采用扩展方法的方式。 - JARRRRG
@Jurg 这是非常常见的需求,不是吗?我一直在使用它。对于 Linq to Objects 很好用,但还没有尝试过 IQueryables。 - nawfal
1
@VSB 扩展方法甚至对于 Linq-2-SQL 都不起作用。您将不得不直接调用 Contains 方法,它将被执行为 IN - nawfal
显示剩余4条评论

17
public List<Requirement> listInquiryLogged()
{
    using (DataClassesDataContext dt = new DataClassesDataContext(System.Configuration.ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
    {
        var inq = new int[] {1683,1684,1685,1686,1687,1688,1688,1689,1690,1691,1692,1693};
        var result = from Q in dt.Requirements
                     where inq.Contains(Q.ID)
                     orderby Q.Description
                     select Q;

        return result.ToList<Requirement>();
    }
}

1
它的等价方法语法是什么? - Vahid Ghadiri
2
非常感谢您,我已经苦苦挣扎了好几天,这是唯一有效的解决方案。如此简单而有效的解决方案。 - Dennis

10

通过 .Contains() 方法,Linq 内置了 "IN" 子句。

例如,要获取所有州为 "NY" 或 "FL" 的人:

using (DataContext dc = new DataContext("connectionstring"))
{
    List<string> states = new List<string>(){"NY", "FL"};
    List<Person> list = (from p in dc.GetTable<Person>() where states.Contains(p.State) select p).ToList();
}

4
from state in _objedatasource.StateList()
where listofcountrycodes.Contains(state.CountryCode)
select state

2

这个想法有点不同,但对你很有用。我在linq主查询中使用了子查询。

问题:

假设我们有一个文档表,其架构如下:

架构:document(name,version,auther,modifieddate)

组合键:name,version

因此,我们需要获取所有文档的最新版本。

解决方案:

 var result = (from t in Context.document
                          where ((from tt in Context.document where t.Name == tt.Name
                                orderby tt.Version descending select new {Vesion=tt.Version}).FirstOrDefault()).Vesion.Contains(t.Version)
                          select t).ToList();

1
public List<State> GetcountryCodeStates(List<string> countryCodes)
{
    List<State> states = new List<State>();
    states = (from a in _objdatasources.StateList.AsEnumerable()
    where countryCodes.Any(c => c.Contains(a.CountryCode))
    select a).ToList();
    return states;
}

6
欢迎来到SO,这里的一个好习惯是解释为什么要使用你的解决方案而不仅仅是如何。这将使您的答案更有价值,并帮助读者更好地理解您的方法。我还建议您查看我们的常见问题解答:http://stackoverflow.com/faq。 - ForceMagic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接