2013-04-10 102 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