如何从表记录中选择除某些列以外的表记录

我有一个从sql数据库创建的实体数据库。 我需要在datagridview上显示记录,我正在使用此代码。

DBEntities db = new DBEntities(); dataGridView1.DataSource = db.Agent.Select(x => new { Name = x.Name, Second_Name = x.Second_Name}).ToList(); 

例如,真正的代理表包含大约10列,我需要显示所有,exept’id’。 如果我为每8列做同样的事情,那么就变成一条长而无意义的行。 怎么做更多的遗忘和好。

如果您不想使用匿名类型指定所需的字段,则可以:

  1. 生活在结果集中有ID,或
  2. 包括Select除ID之外的所有列,或
  3. 使用映射库,如AutoMapper。

Linq中没有Select Except声明。 但是,您可以使用此扩展方法来完成相同的操作:

 ///  /// Returns all fields/properties from  except for the field(s)/property(ies) listed in the selector expression. ///  public static IQueryable SelectExcept( this IQueryable source, Expression> selector ) { var newExpression = selector.Body as NewExpression; var excludeProperties = newExpression != null ? newExpression.Members.Select( m => m.Name ) : new[] { ( (MemberExpression)selector.Body ).Member.Name }; var sourceType = typeof( TSource ); var allowedSelectTypes = new Type[] { typeof( string ), typeof( ValueType ) }; var sourceProperties = sourceType.GetProperties( BindingFlags.Public | BindingFlags.Instance ).Where( p => allowedSelectTypes.Any( t => t.IsAssignableFrom( ( (PropertyInfo)p ).PropertyType ) ) ).Select( p => ( (MemberInfo)p ).Name ); var sourceFields = sourceType.GetFields( BindingFlags.Public | BindingFlags.Instance ).Where( f => allowedSelectTypes.Any( t => t.IsAssignableFrom( ( (FieldInfo)f ).FieldType ) ) ).Select( f => ( (MemberInfo)f ).Name ); var selectFields = sourceProperties.Concat( sourceFields ).Where( p => !excludeProperties.Contains( p ) ).ToArray(); var dynamicSelect = string.Format( "new( {0} )", string.Join( ", ", selectFields ) ); return selectFields.Count() > 0 ? source.Select( dynamicSelect ) : Enumerable.Empty().AsQueryable(); } 

进一步阅读
当您懒得输入时,请使用SelectExcept

为什么不使用automapper将实体对象转换为域对象?

 Mapper.CreateMap(); dataGridView1.DataSource = db.Agent.Select(x => Mapper.Map(x)).ToList(); 

AgentDto将包含除“Id”之外的所有字段

这个问题在这里得到解答,这绝对是可能的。 如果不需要的属性可以为空,或者您可以使用匿名,则可以将所选列再次强制转换为原始对象的可枚举。

例如 :

  1. 完整查询在LINQ Pad再次测试真实表

    来自l in Lessons选择新的{l.Id,l.Description,l.LanguageId,
    l.CreatedOn}

得到了SQL:

 SELECT [t0].[Id], [t0].[Description], [t0].[LanguageId], [t0].[CreatedOn] FROM [Lessons] AS [t0] 
  1. 剪切版本在LINQ Pad中测试,列数较少

    来自l in Lessons选择新的{l.CreatedOn}

得到了SQL:

 SELECT [t0].[CreatedOn] FROM [Lessons] AS [t0] 

毕竟, 您可以隐藏dataGridView中的列。

如果您不想编写匿名对象,可以使用AutoMapper作为@ maruthu chandrasekaran建议。

这样,您就可以将缩减的linq查询服务器并将其映射到一行中的对象,而不会出现匿名对象的抖动。 您也可以创建DTO对象。 使用Entity-EntityDto与AutoMapper进行映射是一项简单的工作。