Come selezionare dai record di tabella tranne alcune colonne

Ho un database di quadro, creato dal database sql. Devo mostrare il record su datagridview, sto usando questo codice.

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

Ad esempio, la tabella degli agenti reali contiene circa 10 colonne e ho bisogno di mostrare tutti, escluso “id”. Se faccio lo stesso per ogni 8 colonne, diventa una fila lunga e insensata. Come farlo più oblivious e buono.

Se non si desidera utilizzare un tipo anonimo per specificare i campi desiderati, è ansible:

  1. Vivere con l’ID nel set di risultati, o
  2. Includere tutte le colonne in Select tranne per l’ID o
  3. Utilizzare una libreria di mapping, come AutoMapper.

Non c’è alcuna istruzione Select Except in Linq. Tuttavia, puoi utilizzare questo metodo di estensione per realizzare la stessa cosa:

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

Ulteriori letture
Usa SelectExcept quando sei troppo pigro per scrivere

Perché non usi l’automapper per convertire l’object entity framework in un object dominio?

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

AgentDto conterrà tutti i campi tranne ‘Id’

Questa domanda ha una risposta qui ed è sicuramente ansible. È ansible eseguire nuovamente il cast delle colonne selezionate in enumerabile dell’object originale se le proprietà indesiderate sono annullabili o se è ansible utilizzare anonimi.

Per esempio :

  1. Interrogazione completa testata in LINQ Pad sulla tabella reale

    da l in Lezioni seleziona new {l.Id, l.Description, l.LanguageId,
    l.CreatedOn}

ha generato SQL:

 SELECT [t0].[Id], [t0].[Description], [t0].[LanguageId], [t0].[CreatedOn] FROM [Lessons] AS [t0] 
  1. La versione tagliata è stata testata in LINQ Pad con meno colonne

    da l in Lezioni seleziona new {l.CreatedOn}

ha generato SQL:

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

Dopo tutto quello che è ansible hide una colonna in DataGridView.

Se non vuoi scrivere l’object anonimo, puoi usare AutoMapper come suggerito @ maruthu chandrasekaran.

In questo modo sarai in grado di ridimensionare la tua query linq e mapparla sul tuo object in una riga senza il jitter dell’object anonimo. È anche ansible creare un object DTO. Utilizzare i mapping Entity-EntityDto con AutoMapper è un lavoro facile.