这只是选择从汽车的一些列:DataContext的翻译<>匿名类型
var qs = myDataContext.Cars
.Select(c => new { c.id, c.color })
.ToList();
我需要的是功能,即会做同样的,而是通过SqlCommand的,这样我就可以改变的过程。它的(简化)代码是在这里
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
}
功能非常适用于普通班这样
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();
但它未能对匿名类型
var qa = myDataContext.Cars
.ProjectionFunction(c => new { c.id, c.color })
.ToList();
我得到运行时错误
类型 <> f__AnonymousType20`2 [System.Nullable`1 [System.Int32],System.String] 必须声明一个默认(无参数)构造函数,以便在映射期间构造为 。
对于Translate<>
功能。我试过的ExecuteQuery<>
也一样。很难相信DataContext不知道如何构建匿名类型,这是他一直都在做的事情。我错过了什么?我怎么能让他为我做这件事?
单独的一个使用类的问题是,它的属性必须与原始类的属性的类型和名称显式同步,这使得这种方法有些不切实际。