id喜欢将一组对象中的某个属性与数组进行比较,如下所示:
List<Entity.Error> errorList = new List<Entity.Error>();
Guid[] guids = GetArrayOfGuids();
errorList.AddRange(Entity.ErrorCollection.errorCollection.Where(x => x.id == guids));
我希望这可以不使用:
foreach(Guid g in guids)
errorList.AddRange(Entity.ErrorCollection.errorCollection.Where(x => x.id == g));
所以,如果您有任何想法,请告诉我。
编辑:
这有效:
var query = from error in Entity.ErrorCollection.errorCollection
join guid in GetArrayOfGuids()
on error.product.id equals guid1
select error;
errorList.AddRange(query);
但是error.products.version是一个Entity.Version的List,我也想通过另一个Guid []查询。这可能在一个连接中,或者我是否需要在“var query”上进行第二次连接?
答案 0 :(得分:1)
您在逻辑上做的是join
:
var query = from error in errorList
join guid in GetArrayOfGuids()
on error.id equals guid
select error;
这将产生与第二个查询相同的结果,但它会更有效地完成。请注意,如果guid符合多个错误,您的结果中最终会出现重复错误。如果您想避免这种情况,请使用群组加入或致电Distinct
。
答案 1 :(得分:0)
您可以测试guids数组(或列表)是否包含id:
errorList.AddRange(
Entity.ErrorCollection.errorCollection
.Where(x => guids.Contains(x.id))
);
请注意,扫描阵列需要花费与阵列长度成比例的时间。因此,仅将此技术应用于短数组和列表。因为阵列扫描的开销很小 - 例如没有要计算的哈希码 - 但是,如果你只有几个guid,它可以比更精细的算法更快。
对于大量guids,请将其添加到HashSet<Guid>
。 HashSets具有持续的访问时间,即无论你有5个guid还是500个guid都没有区别。 where子句保持不变。