2

阅读了很多 Q 和帖子,发现直到下一个版本才支持子查询/嵌套查询/查询组合。但是我不确定这是否是我需要的,在我的脑海中我会这样写,但我可能会使事情复杂化。

我想像

WARN IF Count > 0 IN
SELECT TYPES WHERE
      IsDirectlyUsing "MTNE.Web.OneWeb.^.*\p{Proxy}+$" IN
      SELECT TYPES WHERE DeriveFrom "System.Web.Services.Protocols.SoapHttpClientProtocol"

所以我想做的是检查类型是否直接使用给定命名空间中具有后缀代理的其他类型,并且代理类型是从 SoapHttpClientProtocol 派生的。如果一个类型直接使用代理类型,则发出警告。

任何人的建议、提示、提示、指针或答案?

4

1 回答 1

0

有几种方法可以编写使用代码规则而不是 LINQ 查询 (CQLinq)提出的查询。当然最优雅、简洁和优化的方式是:

warnif count > 0
let soapClientTypes = Application.Types.Where(t => t.DeriveFrom("System.Web.Services.Protocols.SoapHttpClientProtocol"))
let mnteTypes = Application.Types.WithFullNameLike(@"MTNE.Web.OneWeb.^.*\p{Proxy}+$").ToHashSet()
from t in soapClientTypes.UsingAny(mnteTypes)
select new { t, 
             mnteTypesUsed = t.TypesUsed.Intersect(mnteTypes) }

请注意我们如何首先定义 2 个集合,并使用扩展方法ToHashSet()来优化Intersect()方法的执行。

还要注意方法UsingAny()的用法,它在一次调用中执行大量工作。

于 2011-04-22T11:06:14.417 回答