LINQ中的IN子句

pri*_*kar 147 c# linq

如何在SQL Server中创建一个类似于where的子句?

我自己做了一个,但任何人都可以改进吗?

    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;
    }
Run Code Online (Sandbox Code Playgroud)

Dan*_*ner 241

这个表达式应该做你想要达到的目标.

dataSource.StateList.Where(s => countryCodes.Contains(s.CountryCode))
Run Code Online (Sandbox Code Playgroud)

  • 这将比较字符串值,但ids怎么样? (9认同)

Sco*_*vey 94

这将转换为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));
Run Code Online (Sandbox Code Playgroud)

在您的查询的情况下,您可以做这样的事情......

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});
Run Code Online (Sandbox Code Playgroud)


naw*_*fal 33

我喜欢它作为扩展方法:

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

现在你打电话:

var states = _objdatasources.StateList().Where(s => s.In(countrycodes));
Run Code Online (Sandbox Code Playgroud)

您也可以传递单个值:

var states = tooManyStates.Where(s => s.In("x", "y", "z"));
Run Code Online (Sandbox Code Playgroud)

感觉更自然,更接近sql.

  • 我应该在哪里写这个扩展方法 (2认同)

小智 10

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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢您为此,已经奋斗了几天,这是唯一有效的方法。如此简单有效的解决方案。 (2认同)

nik*_*d23 6

"IN"子句通过.Contains()方法内置到linq中.

例如,要获取.States为"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();
}
Run Code Online (Sandbox Code Playgroud)