2017-03-07 4 views
3

私は流暢なAPIでNet Core 1.1とEntity Framework Coreを使用します。私は、コンソールでその実体を示すために、DbSetのための単純な拡張メソッドを書いています: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(); 
    } 
} 

これは動作しますが、私はそれらを示す前に、プライマリキーでソートエンティティを持っているしたいと思います。

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(); 

DbSetから始まる同じ結果を取得する方法があります:私はDbContextを持っていた場合、それは簡単にこのような何かを行うことによって達成されているのでしょうか?

答えて

4

とマークされたいくつかのメソッドを使用する必要がありますが、このAPIはEntity Frameworkコアインフラストラクチャをサポートしており、コードから直接使用するためのものではありません。このAPIは将来のリリースで変更されるか、または削除される可能性があります。。それはそうそれは動作しますので、私はイワンStoevのソリューションを受け入れ

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(); 
... 
0

あなたは基本的にあなたがModelプロパティからモデルを得るためにGetServiceメソッドを介してIDbContextServicesを得ることができるようにDbSet<T>は、IInfrastructure<IServiceProvider>を実装しているという事実を利用します私の質問に対する非常に良い答えです。

しかし、イワンは GetServiceを指摘し、 IDbContextService APIが このAPIは、Entity Frameworkのコアインフラストラクチャをサポートします。コードから直接使用するためのものではありません」とマークされているよう。このAPIは、変更される可能性や、将来のリリースでは削除されます。.. "と私は自分のコードでそれらを使用しないことを好む。

内部とリフレクションを使用しない別のアプローチは、ソートプロパティをパラメータとして受け入れるように拡張メソッドを書き直すことです。これにより柔軟性も向上します。

それは同じ問題で他の人に有用である可能性があるので、私はこの代替解決策を掲載しています:

using System; 
using Microsoft.EntityFrameworkCore; 
using System.Linq; 
using static System.Console; 

public static class DbSetExtension 
{ 
    public static void ShowSortedBy<T,TKey>(this DbSet<T> set, Func<T,TKey> keySelector) where T:class 
    { 
     var sortedSet = set.OrderBy(x => keySelector(x)).ToList(); 

     WriteLine(); 
     WriteLine($"Set: {typeof(T).Name} - {set.Count()} objects."); 
     WriteLine(); 

     foreach (var e in sortedSet) 
     { 
      WriteLine(e); 
     } 

     WriteLine(); 
     WriteLine(); 

    } 
} 
関連する問題