当使用LINQ to Entities时,有没有比强制转换到列表更好的方法来使用不受支持的代码/扩展
本文关键字:方法 更好 支持 扩展 代码 列表 转换 Entities to LINQ 有没有 | 更新日期: 2023-09-27 18:20:29
我发现自己需要经常做这样的事情,我只是想知道是否有更好的方法。
假设我有一个类,它保存了一些数据的快照:
private List<Person> _people;
在某些方法中,我使用实体框架从LINQ查询中填充该列表,例如,我可能需要在上面运行一个自定义的IEqualityComparer。由于LINQ to实体不支持这一点,我最终得到了这样的结果:
_people = db.People.Where(...)
.ToList()
.Distinct(new MyCustomComparer())
.ToList();
另一个例子可能是使用扩展方法,在LINQ to实体中也不支持这种方法:
_people = db.People.Where(...)
.ToList()
.Select(_ => new { Age = _.DOB.MyExtensionMethod() })
.ToList();
为了使用其中的任何一个,我必须使用第一个ToList()将数据库实体强制转换为常规内存对象,然后由于我最终想要一个列表,所以在最后我有一个最后的强制转换ToList(()。在我看来,这似乎效率低下,我想知道是否有更好的模式来应对这些类型的情况?
您可以使用AsEnumerable()
:
_people = db.People.Where(...)
.AsEnumerable()
.Distinct(new MyCustomComparer())
.ToList();
相当于:
IEnumerable<Person> _people = db.People.Where(...);
_people = _people.Distinct(new MyCustomComparer()).ToList();
这并没有太大的改进,但至少它不会创建另一个List<T>
,并且更好地表达了您想要切换到IEnumerable<T>
(在内存中)的领域。
请参阅MSDN