当使用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(()。在我看来,这似乎效率低下,我想知道是否有更好的模式来应对这些类型的情况?

当使用LINQ to Entities时,有没有比强制转换到列表更好的方法来使用不受支持的代码/扩展

您可以使用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