這只是選擇從汽車的一些列: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不知道如何構建匿名類型,這是他一直都在做的事情。我錯過了什麼?我怎麼能讓他爲我做這件事?
單獨的一個使用類的問題是,它的屬性必須與原始類的屬性的類型和名稱顯式同步,這使得這種方法有些不切實際。