我正在加入2个内存集合
var items =
from el in elements
join def in Cached.Elements()
on el.Value equals def.Name into temp1
from res in temp1.DefaultIfEmpty()
select new
{
el.NodeType,
res.DefKey,
res.DefType,
res.BaseKey,
el.Value
};
然而,理想情况下,如果找不到其中一个元素,我想提出异常,类似于
throw new System.Exception(el.Value + " cannot be found in cache!");
我正在查看提供Catch扩展方法的System.Interactive,但我不确定如何在该上下文中引用当前的'el'。所以例如我想知道像
这样的东西 var items = (
from el in elements
join def in Cached.Elements()
on el.Value equals def.Name into temp1
from res in temp1.DefaultIfEmpty()
select new
{
el.NodeType,
res.DefKey,
res.DefType,
res.BaseKey,
el.Value
})
.ThrowIfEmpty();
但是,istm,这需要将整个集合传递给扩展方法,而不是在遇到缺失值时引发异常。
或者,我可以用ThrowIfEmpty
替换DefaultIfEmpty var items = (
from el in elements
join def in Cached.Elements()
on el.Value equals def.Name into temp1
from res in temp1.ThrowIfEmpty()
select new
{
el.NodeType,
res.DefKey,
res.DefType,
res.BaseKey,
el.Value
});
有没有'正确'/更好的方法呢?
答案 0 :(得分:2)
您可以使用GroupJoin。这样的事情对你有用:
elements.GroupJoin(Cached.Elements(), e => e.Value, d => d.Name, (e, dSeq) => {
var d = dSeq.Single();
return new { e, d };
});
GroupJoin resultSelector接受两个参数:左键和匹配右键的序列。如果序列为空,则可以引发异常;一种方法是使用Single运算符。
答案 1 :(得分:1)
我认为这是您可以使用Composite Keys的地方之一。
如果使用equals
关键字在连接时执行相等。
来自文档:
您可以将复合键创建为匿名类型或命名为 要比较的值。如果查询变量将是 传递方法边界,使用覆盖的命名类型 密钥的等于和GetHashCode