vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit. 
Autor: Drapondur
Datum: 04.08.08 20:12

Kleine Vorbemerkung: für den Code hier wird die AdventureWorks-Datenbank verwendet.

Die Idee ist folgende:
Da Du später sowieso Arrays brauchst, kannst Du auch gleich direkt Arrays aus der DB ziehen.
Using ctx As New AdventureWorksDataContext
	ctx.Log = Console.Out
	Dim qry = From em In ctx.Employees _
	 Where em.BirthDate > DateTime.Parse("1.1.1971") _
	 Select New Object() {em.EmployeeID, em.BirthDate}
 
	Dim result As List(Of Object()) = qry.ToList
End Using
An dieser Stelle haben wir immer noch das Problem, die erwünschten Spalten noch nicht dynamisch hinzufügen zu können. Also erstellen wir ein Modul mit einer neuen Extension.
Imports System.Linq.Expressions
 
Module QueryExtensions
 
	''' <summary>
	''' Projiziert jedes Element einer Sequenz in eine Sequenz von Object-Arrays, 
' wobei die
	''' Reihenfolge der Werte in jedem Object-Array den in propertyOrFieldName 
' angegebenen
	''' Namen entspricht.
	''' </summary>
	''' <typeparam name="T">Der Typ der Elemente von qry.</typeparam>
	''' <param name="qry">Eine Sequenz von zu projizierenden Werten.</param>
	''' <param name="propertyOrFieldName">Eine Auflistung von Property- oder 
' Feldnamen.</param>
	<System.Runtime.CompilerServices.Extension()> _
	Public Function ColumnSelect(Of T)(ByVal qry As IQueryable(Of T), ByVal _
ParamArray propertyOrFieldName As String()) As IQueryable(Of Object())
		If qry Is Nothing Then
			Throw New ArgumentNullException("qry")
		End If
		If propertyOrFieldName.Length = 0 Then
			Throw New ArgumentException("Es muss mindestens ein Property- bzw. FieldName" & _
  "angegeben werden", "propertyOrFieldName")
		End If
 
		Dim pxp As ParameterExpression = Expression.Parameter(GetType(T), "p")
 
		Dim initializers As New List(Of Expression)
		For Each memberName As String In propertyOrFieldName
			Dim memXp As MemberExpression = Expression.PropertyOrField(pxp, memberName)
			Dim quote As UnaryExpression = Expression.Quote(memXp)
			initializers.Add(quote)
		Next
 
		Dim newArXp As NewArrayExpression = Expression.NewArrayInit(GetType(Object), _
  initializers)
		Dim lamba As LambdaExpression = Expression.Lambda(newArXp, pxp)
		Dim typeArguments As Type() = {qry.ElementType, lamba.Body.Type}
		Dim methodCallXp As MethodCallExpression = Expression.Call(GetType( _
  Queryable), "Select", typeArguments, qry.Expression, lamba)
 
		Dim retQry As IQueryable(Of Object()) = qry.Provider.CreateQuery(Of Object())( _
  methodCallXp)
		Return retQry
	End Function
 
 
End Module
Beispiel für eine Abfrage, die zwei Datenbankspalten abfragt
Using ctx As New AdventureWorksDataContext
	ctx.Log = Console.Out
	Dim qry = From em In ctx.Employees _
	 Where em.BirthDate > DateTime.Parse("1.1.1971") _
	 Select em
 
	Dim result As List(Of Object()) = qry.ColumnSelect("EmployeeID", _
  "BirthDate").Take(10).ToList
End Using
Das gleiche mit nur einer Spalte
Using ctx As New AdventureWorksDataContext
	ctx.Log = Console.Out
	Dim qry = From em In ctx.Employees _
	 Where em.BirthDate > DateTime.Parse("1.1.1971") _
	 Select em
 
	Dim result As List(Of Object()) = qry.ColumnSelect("EmployeeID").Take( _
  10).ToList
End Using
Beispiel mit Array als Paramterübergabe
Using ctx As New AdventureWorksDataContext
	ctx.Log = Console.Out
	Dim qry = From em In ctx.Employees _
	 Where em.BirthDate > DateTime.Parse("1.1.1971") _
	 Select em
	Dim colNames As String() = {"EmployeeID", "BirthDate"}
	Dim result As List(Of Object()) = qry.ColumnSelect(colNames).Take(10).ToList
End Using
Statt Dim colNames As String() = {"EmployeeID", "BirthDate"} kannst Du natürlich jedes beliebige, dynamisch erstellte Array hernehmen.

Ciao D.

Beitrag wurde zuletzt am 04.08.08 um 20:16:31 editiert.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
LINQ: Dynamische Abfrageergebnisse3.964reini6904.08.08 10:38
Re: LINQ: Dynamische Abfrageergebnisse3.167ModeratorRalf Ehlert04.08.08 12:07
Re: LINQ: Dynamische Abfrageergebnisse3.254reini6904.08.08 12:50
Re: LINQ: Dynamische Abfrageergebnisse3.049ModeratorRalf Ehlert04.08.08 18:44
Re: LINQ: Dynamische Abfrageergebnisse3.265Drapondur04.08.08 19:57
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit.3.296Drapondur04.08.08 20:12
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit.3.035reini6905.08.08 10:01
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit.3.043Drapondur05.08.08 15:38
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit.3.211reini6905.08.08 16:41
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit.3.128reini6907.08.08 13:03
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit.3.020Drapondur07.08.08 14:06
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit.3.056reini6907.08.08 14:23
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit.3.092Drapondur07.08.08 14:39
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit.3.004reini6907.08.08 14:48
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit.3.080Drapondur07.08.08 15:15
Re: LINQ: Dynamische Abfrageergebnisse 3. Möglichkeit.3.068reini6907.08.08 15:29

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel