我不知道Find()
和之间的实现差异是什么Where()
。虽然我怀疑它们是相同的巧合,但我建议坚持使用 LINQ 扩展方法(Where()
等Single[OrDefault]()
)而不是特定于您选择的集合实现的方法。因为它们是扩展方法,所以IEnumerable<T>
如果您愿意,您可以更灵活地选择不同的集合实现。
对于奖励积分:
不过,这里有几件事让我担心——你从某个地方加载东西,然后在内存中过滤它们。我希望看到更类似于:
Item item = Item.GetItemForId(2);
这将过滤留给(大概)数据库。尽管这可能违反了 SRP,但实际上您正在前往:
IRepository<Item> repository = this.itemRepository;
Item item = repository.Get(2);
如果您使用完整的 Linq to SQL/Entities,您将能够利用延迟执行并执行以下操作:
Item item = context.Items.SingleOrDefault(i => i.Id == 2);
这不会在调用之前加载所有项目SingleOrDefault()
,而是会查看 who 表达式并为其生成适当的 SQL,例如:
SELECT [fields] FROM Item WHERE Id = @id
这都是我的假设,但我确实想明确指出,Linq to Entities(实体框架)和Linq to SQL之间存在很大差异,后者构建 SQL 语句以发送到数据库,而Linq to Objects是相同的方法调用,但在内存中的集合对象上工作。