请帮助我在其中一个场景中,我被困住了。Linq交叉连接查询嵌套列表
它是这样的。
使用PropertyGrid动态创建的列表和列表中的字段(内部表)列表。
BindingList<Table> table = new BindingList<Table>(); [Serializable] [TypeConverter(typeof(TableConverter))] public class Table { private string _name = string.Empty; private HeaderCollection _hc = new HeaderCollection(); private BindingList<Fields> _fc = new BindingList<Fields>(); public Guid key; public Table() { key = Guid.NewGuid(); } [DisplayName("Table Fields"), Editor(typeof(FieldCollectionEditor), typeof(UITypeEditor))] public BindingList<Fields> Fields { get { return _fc; } set { _fc = value; } } [DisplayName("Table Header")] public HeaderCollection Headers { get { return _hc; } set { _hc = value; } } [DisplayName("Table Name")] public string Name { get { return _name; } set { _name = value; } } }
Field类定义
[Serializable] public class Fields { private string _name = string.Empty; public Guid Key; private List<string> _value = new List<string>(); [Browsable(false)] public List<string> Value { get { return _value; } set { _value = value; } } public Fields() { Key = Guid.NewGuid(); } [DisplayName("Field Name")] public string Name { get { return _name; } set { _name = value; } } [DisplayName("Map")] public bool Map { get; set; } }
Field类包含字符串列表,以容纳一个或多个值。
我的问题是:需要交叉连接所有值beloging到表中的所有字段并以表格格式显示数据。 我已经使用了这个查询,但是这不起作用,因为它会逐个提取值,而我需要一次性从所有字段的所有值进行coross连接。
var result = table.SelectMany(
tbl => tbl.Fields.SelectMany(
f => f.Value.Select(v => new { i = v })));
例如 可以说:
F1 has Value11
F2 has Value21
F3 has Value31 and Value 32
F4 has Value41, Value42 and Value43
结果应该是在此格式为每个表和所有字段值。
Value11 Value21 Value 31 Value 41
Value11 Value21 Value 31 Value 42
Value11 Value21 Value 31 Value 43
Value11 Value21 Value 32 Value 41
Value11 Value21 Value 32 Value 42
Value11 Value21 Value 32 Value 43
让我详细说明这一点。例如,如果我们有
List<string> master = new List<string>();
List<string> child = new List<string>();
List<string> child1 = new List<string>();
List<string> child2 = new List<string>();
and a Linq query to fetch out
var q = from m in master
from c1 in child1
from c in child
from c2 in child2
select new { m, c, c1, c2 };
我正好需要这样写上面的查询获取了字段值,但字段动态生成的问题,因此它们的值里面,所以我需要某种recussive方法或linq过程来获得上面示例中提供的结果。
这为我场的x值,而不是我需要的价值X值(跨所有领域)。 – user885412 2010-11-03 03:48:15
@Buzzy:你的回答应该作为对问题的修改来完成(因为它正在扩大/改进问题,而不是回答)。第二:我必须考虑这一点(想到递归),第三:Eric Lippert已经解决了我的问题:http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/计算笛卡尔的产品与LINQ.aspx – Richard 2010-11-03 08:58:24
谢谢理查德,我要通过埃里克利珀博客,我会回来,这并不能解决我的问题 – user885412 2010-11-03 10:34:49