选择Linq中的所有子对象

时间:2009-06-17 20:50:08

标签: c# linq linq-to-sql

这真的应该很简单,但我自己无法解决,界面不够直观...... :(

假设我有一个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..."

本能地,我想相信你能做到这一点,但我还没有找到方法......

1 个答案:

答案 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);