Nic*_*ada 5 c# entity-framework-core .net-core
我将 Net Core 1.1 和 Entity Framework Core 与流畅的 API 一起使用。我正在为 DbSet 编写一个简单的扩展方法,以在控制台中显示其实体:
public static class DbSetExtension
{
public static void Show<T>(this DbSet<T> set) where T:class
{
WriteLine();
WriteLine($"Set: {typeof(T).Name} - {set.Count()} objects.");
WriteLine();
foreach (var e in set)
{
WriteLine(e);
}
WriteLine();
WriteLine();
}
}
Run Code Online (Sandbox Code Playgroud)
这有效,但我希望在显示实体之前按主键排序。如果我有DbContext它,它会很容易通过做这样的事情来完成:
var entityType = db.Model.FindEntityType(typeof(T));
var primaryKeyName = entityType.FindPrimaryKey().Properties.First().Name;
var set = db.Set<T>();
var orderedEntities = (set.OrderBy(e=> e.GetType().GetProperty(primaryKeyName).GetValue(e,null))).ToList();
Run Code Online (Sandbox Code Playgroud)
有没有办法从DbSet?开始获得相同的结果?
这是可能的,但不是“官方” - 您必须使用一些标记为此API 支持实体框架核心基础结构的方法,并且不打算直接从您的代码中使用。此 API 可能会在未来版本中更改或删除。.
您基本上利用了DbSet<T>implements的事实IInfrastructure<IServiceProvider>,因此您可以IDbContextServices通过GetService方法获取以从Model属性中获取模型:
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Internal;
...
var model = set.GetService<IDbContextServices>().Model;
var entityType = model.FindEntityType(typeof(T));
var properties = entityType.GetProperties();
var primaryKeyName = entityType.FindPrimaryKey().Properties.First().Name;
var sortedSet = (set.OrderBy(e=> e.GetType().GetProperty(primaryKeyName).GetValue(e,null))).ToList();
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2420 次 |
| 最近记录: |