Linq查询集合属性和匹配所有孩子

时间:2013-11-22 01:43:13

标签: linq entity-framework collections children

我正在研究这个查询,因为我对Linq很陌生,所以我需要一段时间。

我有两个集合c.l.ChoreTIsc.r.ChoreTIs

我希望所有c.l.Chore.TIs.Name == c.r.ChoreTIs.Name的所有参数都与parameterValue的所有参数(儿童)匹配。

我非常接近,但仍有一些问题

Dim Query = From l In c.l.ChoreTIs _
                            Join r In c.r.ChoreTIs On l.Name Equals r.Name _
                            Where (l.Parameters.All(Function(lp) r.Parameters.Any(Function(rp) lp.parameterValue = rp.parameterValue)))
                            Select New With {.lChore = l, .rChore = r}

查询有效,但即使并非所有ChoreTIs都匹配,我也会获得与名称匹配的所有Parameters.parameterValue。我需要返回所有不完全匹配的地方。

我只想要与名称相匹配的ChoreTIs,但它们没有完全相同数量的子项(参数)或一个参数具有不同的parameterValue

有更好的方法吗?或者我该如何解决?

干杯

更新:

Dim Query = From l In c.l.ChoreTIs _
                            Join r In c.r.ChoreTIs On l.Name Equals r.Name _
                            Where (l.Parameters.Count <> r.Parameters.Count) Or _
                                  ((l.Parameters.Count = r.Parameters.Count) And
                                  (l.Parameters.Select(Function(lp) lp.parameterValue).Except(r.Parameters.Select(Function(rp) rp.parameterValue)).Any()))
                            Select New With {.lChore = l, .rChore = r}

我得到了它的工作,但如果有人有更好的方法,我仍然会很热衷。

2 个答案:

答案 0 :(得分:0)

我认为你可以尝试使用intersect:

var newData = c.l.ChoreTIs.Select(a => a.Name).Intersect(c.r.ChoreTIs.Select(s => s.Name));

答案 1 :(得分:0)

我的VB语法可能不是100%正确,但这更接近你想要的东西:

    Dim query = _
        From l In c.l.ChoreTIs _
        Join r In c.r.ChoreTIs On l.Name = r.Name _
        Where (l.Parameters.All(Function(lp) r.Parameters.Any(Function(rp) lp = rp)))
        New From _
        { _
            l, _
            r _
        }