LINQ 中的 IN 子句在哪里

如何使 where in 子句类似于 SQLServer 中的 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;
}
586201 次浏览

这将转换为 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});

这个表达式应该做你想做的事情。

dataSource.StateList.Where(s => countryCodes.Contains(s.CountryCode))
from state in _objedatasource.StateList()
where listofcountrycodes.Contains(state.CountryCode)
select state

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

例如,获取所有.state 为“ 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();
}
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;
}

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

问题:

假设我们有文档表 模式: 文件(名称、版本、作者、修改日期) 复合键: 名称,版本

所以我们需要所有文件的最新版本。

解决方案

 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();

我喜欢它作为一种扩展方法:

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。

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>();
}
}