1

EF アプリ用の動的な linq 式を作成しようとしています。

タイプを表す列挙型があります。

public class MyEntity {
  public int? One { get; set; }
  public int? Two { get; set; }
  public int? Three { get; set; }
  // other fields..
}

public enum MyType {
  One,
  Two,
  Three
}

public static Expression<Func<MyEntity, int?>> GetItem(MyType myType) {
  switch(myType) {
    case One: return (e) => e.One;
    case Two: return (e) => e.Two;
    case Three: return (e) => e.Three;
    default: throw new NotImplementedException();
  }
}

タイプによっては、それに対してクエリを実行したい。たとえば、タイプ列が特定の値に等しいかどうかを確認したい:

public static Expression<Func<MyEntity, int?>> EqualsValue(MyType myType, int value) {
  return Expression.Equal(GetItem(myType), Expression.Constant(value));
}

これにより、BinaryExpression から Expression> にキャストできないというコンパイラ エラーが発生します。これを行うより良い方法はありますか?

アップデート:

私は EF のようにそれを使用したいと思います:ctx.MyEntities.Where(EqualsValue(myType, value)).Where(u => u.UserID == userID)したがって、戻り値の型はExpression<Func<MyEntity, int?>>.. である必要があります。Linq to SQL と EF DataService で動作する必要があります。

4

1 に答える 1

1

あなたはできるはずです:

public static Expression<Func<MyEntity, int?>> EqualsValue(MyType myType, int value) {
  return (e) => GetItem(myType)(e) == value;
}
于 2012-10-01T22:31:10.650 に答える