2013-04-10 198 views
14

我已經像一個查詢這個錯誤創建LINQ查詢

struct MyStruct 
{ 
    public string name; 
    public double amount; 
} 

var a = 
    from p in Products 
    select new MyStruct 
    { 
    name = p.Name, 
    amount = p.Amount 
    }; 

當我執行查詢,我得到以下異常:

System.NotSupportedException {「只有參數構造函數LINQ to Entities支持初始值設定項。「}

但是如果我將MyStruct的類型更改爲然後它按預期工作。

它爲什麼與一起使用,並且以失敗struct

回答

3

它與LinqToObjects一起使用。我猜LinqToEntities不知道如何創建一個結構。如果你這樣做,你會被罰款:

struct MyStruct 
{ 
    public string name; 
    public double amount; 
} 

var a = Products.AsEnumerable() 
    .Select(p => new MyStruct 
    { 
     name = p.Name, 
     amount = p.Amount 
    }; 
+1

但是,你不會限制查詢指定的字段,這是做選擇開始的關鍵點之一。 – Servy 2013-04-10 17:43:04

+0

如果您擔心不會從數據庫中提取無關數據,則可以在兩者之間創建一個匿名類。我不明白他爲什麼使用結構。 – Shlomo 2013-04-10 17:47:29

+0

我覺得他對'爲什麼'更感興趣,然後'我該如何解決'。 – Shlomo 2013-04-10 17:47:54

-1

試試這個:

struct MyStruct 
{ 
      public string name; 
      public double amount; 
} 

Products[] p1 = new Products[] { new Products { name = "prod1", amount = 5 } 
var c = from p in p1 
     select new MyStruct { name = p.name, amount = p.amount }; 
+0

他沒有對對象執行Linq,他使用查詢提供程序,這是查詢提供者無法解釋這個問題。 – Servy 2013-04-10 17:44:44

2

LINQ到實體不支持伸入結構。他們需要爲查詢提供者設計對此的支持,並且他們只是選擇不這樣做。看起來,他們認爲它不足以支持其值得開發成本。

您需要在您的查詢中投射新的實例。

+0

> Linq to entities不支持投射到結構中<你是如何得出這個結論的?你有沒有讀過它?我不是在質疑你的知識,我只是想知道你是否使用了一些機制來發現它,所以我可以在將來做同樣的事情。 – vcRobe 2013-04-10 18:42:25