实体框架通用

Ale*_*.P. 5 c# entity-framework

我有以下代码:

switch(sort.Column)
{
  case "code":
    model = (sort.Direction == SortDirection.Ascending)
            ? model.OrderBy(x => x.code)
            : model.OrderByDescending(x => x.code);
    break;
  case "name":
    model = (sort.Direction == SortDirection.Ascending)
            ? model.OrderBy(x => x.name)
            : model.OrderByDescending(x => x.name);
    break;
..............
}
Run Code Online (Sandbox Code Playgroud)

我有大约10-15个字段(比如'代码'和'名称'),我不想复制和粘贴只有一个区别的相似代码 - 字段名称.

是否有方法以某种方式概括查询?

Eth*_*own 7

您可以使用反射(这假定code并且name是属性;如果它们是公共变量,则必须相应地进行修改):

model = (sort.Direction == SortDirection.Ascending)
  ? model.OrderBy( x => x.GetType()
      .GetProperty( sort.Column ).GetValue( x, null ) ) :
  : model.OrderByDescending( x => x.GetType()
      .GetProperty( sort.Column ).GetValue( x, null ) );
Run Code Online (Sandbox Code Playgroud)

正如Dunc在下面的评论中指出的那样,这种方法强制在枚举的每一步进行反射,并且随着操作的进行反射是昂贵的.如果您的集合是同构的,则可以通过将反射移出枚举来实现更好的性能.如果您model包含类型的元素,则可以执行以下操作:Foo

var prop = typeof( Foo ).GetProperty( sort.Column );

model = (sort.Direction == SortDirection.Ascending)
  ? model.OrderBy( x => prop.GetValue( x, null ) ) :
  : model.OrderByDescending( x => prop.GetValue( x, null ) );
Run Code Online (Sandbox Code Playgroud)

TargetException如果您的收藏品不是同质的,请不要这样做.