質問

MVC 6アプリケーション用の汎用テーブルビューア/エディタを作成しようとしています。

私は現在使用しています

Context.GetEntityTypes();

私にテーブルのリストを返す。

今私は特定のタイプのデータを取得する必要があります。私の現在の実装は:

// On my context
public IQueryable<dynamic> GetDbSetByType(string fullname)
{
    Type targetType = Type.GetType(fullname);

    var model = GetType()
        .GetRuntimeProperties()
        .Where(o =>
            o.PropertyType.IsGenericType &&
            o.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>) &&
            o.PropertyType.GenericTypeArguments.Contains(targetType))
        .FirstOrDefault();

    if (null != model)
    {
        return (IQueryable<dynamic>)model.GetValue(this);
    }

    return null;
}

私のコントローラにこのコードを

[HttpGet("{requestedContext}/{requestedTable}/data")]
public IActionResult GetTableData(string requestedContext, string requestedTable)
{
    var data = Request.Query;
    var context = GetContext(requestedContext);

    if (context == null)
    {
        return new ErrorObjectResult("Invalid context specified");
    }
    var entity = context.GetEntity(requestedTable);

    if (entity == null)
    {
        return new ErrorObjectResult("Invalid table specified");
    }

    var set = context.GetDbSetByType(entity.ClrType.AssemblyQualifiedName);

    if (set == null)
    {
        return new ErrorObjectResult("Invalid table specified - DbSet could not be found");
    }

    var start = Convert.ToInt32(data["start"].ToString());
    var count = Convert.ToInt32(data["length"].ToString());
    var search = data["search[value]"];

    return new ObjectResult(set.Skip(start).Take(count));
}

そのままで、長さcountのデータと位置startからのデータを返します。しかし、 IQueryable<dynamic>特定のプロパティでクエリを実行することはできません。

問題は:

  1. これは些細なことのように思えるので、私は何かが欠けていることをほとんど確信しています - これは簡単でなければなりません。
  2. 1でなければ、どのように私のクエリを実行できるように私のobject setDbSet<T>に変換するでしょうか?ブレークポイントを設定して検査すると、そこに座っているすべてのデータを見ることができます。

注:これはEF7です

追加情報:

  1. requestedTable <mysystem>.Models.Shared.Usersは完全修飾型EGです。 <mysystem>.Models.Shared.Users

EDIT(2016/5/5)

私は単純なSQLですべてをやってしまいました - もし誰かがこの作業をすることができたら私に教えてください!

人気のある回答

これは、汎用メソッドを使用し、 DbContext.Set<TEntity>()を使用すると簡単になります。実行時に以下のようにジェネリックメソッドを作成することができます:

public IActionResult GetTableData(string requestedContext, string requestedTable)
{
    var context = GetContext(requestedContext);

    if (context == null)
    {
        return new ErrorObjectResult("Invalid context specified");
    }
    var entity = context.GetEntity(requestedTable);

    if (entity == null)
    {
        return new ErrorObjectResult("Invalid table specified");
    }

    var boundMethod = s_getTableDataMethodInfo.MakeGenericMethod(entity.ClrType);
    return boundMethod.Invoke(this, new object[] { context }) as IActionResult;
}

private static readonly MethodInfo s_getTableDataMethodInfo
    = typeof(MyController).GetTypeInfo().GetDeclaredMethod("GetTableDataForEntity");

private IActionResult GetTableDataForEntity<TEntity>(DbContext context)
    where TEntity : class
{
    var data = Request.Query;
    var start = Convert.ToInt32(data["start"].ToString());
    var count = Convert.ToInt32(data["length"].ToString());
    var search = data["search[value]"];

    return new ObjectResult(context.Set<TEntity>().Skip(start).Take(count));
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ