Dies ist nur Auswahl von Spalten von Autos:Datacontext Übersetzen <> für anonyme Typen
var qs = myDataContext.Cars
.Select(c => new { c.id, c.color })
.ToList();
Was ich brauche, ist eine Funktion, die das gleiche tun würde, aber über SqlCommand, so kann ich den Prozess verändern. Sein (vereinfacht) Code ist hier
public static IEnumerable<P> ProjectionFunction<T, P>(
this System.Data.Linq.Table<T> input,
Func<T, P> projection
) where T : class
{
System.Data.Linq.DataContext dc = input.Context;
string paramList = string.Join(
",",
typeof(P).GetProperties().Select(s => s.Name)
);
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(
"SELECT " + paramList + " FROM " + typeof(T).Name,
(System.Data.SqlClient.SqlConnection)dc.Connection
);
cmd.CommandType = CommandType.Text;
if (cmd.Connection.State == ConnectionState.Closed)
{
cmd.Connection.Open();
}
return dc.Translate<P>(cmd.ExecuteReader()); // <-- the problem is here
}
Die Funktion wie diese auch für den normalen Klassen arbeitet
private class X
{
public int? id { get; set; }
public string color { get; set; }
}
var qx = myDataContext.Cars
.ProjectionFunction(c => new X() { id = c.id, color = c.color })
.ToList();
aber es funktioniert nicht auf anonyme Typen
var qa = myDataContext.Cars
.ProjectionFunction(c => new { c.id, c.color })
.ToList();
ich Laufzeitfehler
Der Typ <> f__AnonymousType20`2 [System.Nullable`1 [System.Int32], System.String] muss einen (parameterlosen) Standardkonstruktor deklarieren, damit beim Mapping erstellt wird.
für Translate<>
Funktion. Die ExecuteQuery<>
versuchte ich auch gleich. Es ist schwer zu glauben, dass DataContext nicht weiß, wie man einen anonymen Typ erstellt, das ist, was er die ganze Zeit macht. Was vermisse ich? Wie kann ich ihn dazu bringen, das für mich zu tun?
Das Problem mit der separaten Klasse für eine Verwendung ist, dass ihre Eigenschaften explizit mit Typen und Namen von Eigenschaften der ursprünglichen Klasse synchronisiert werden müssen, was diesen Ansatz etwas unpraktisch macht.