这真的应该很简单,但我自己无法解决,界面不够直观...... :(
假设我有一个State
表,我想从多个Counties
中选择所有States
。在SQL中将是:
select c.*
from State s join County c on c.StateCode = s.StateCode
where s.TimeZone = -5 -- or some other criteria
上面的例子非常简单,可以在静态上下文中转换为Linq:
var q = MyDataContext.GetTable<County>().Where(c => c.State.TimeZone = -5);
但是,如果我想要更复杂的上下文查询,如下所示:
public static List<County> GetCountiesForStates(List<State> states) {
// gotta do something to return all the counties for all these states
}
现在我可以在这个方法中做这样的事情:
var q = MyDataContext.GetTable<County>().Where(c => states.Contains(c.State));
但IMO非常不优雅,因为(a)我必须得到静态MyDataContext
而不是使用State对象的隐式数据上下文和(b)你正在向后工作,如果你开始使查询进一步复杂化甚至更加丑陋。
有没有办法用以下方式启动查询:
var q = states... // or "from s in states..."
本能地,我想相信你能做到这一点,但我还没有找到方法......
答案 0 :(得分:30)
你可以这样做:
var q = from c in countries
from s in c.States
where c.Property == Something
select s;
这将为您提供所有国家/地区内所有州的列举。这转化为以下内容:
var q = countries.Where(x => c.Property == Something).SelectMany(c => c.States);