C# LINQ to SQL表达式中的DataContractSerializer?

C# LINQ to SQL表达式中的DataContractSerializer?,c#,linq-to-sql,iqueryable,datacontractserializer,C#,Linq To Sql,Iqueryable,Datacontractserializer,我是LINQ表达式的新手,正在尝试让以下内容发挥作用: public IQueryable<Models.Powerups.Powerup> GetPowerups(Guid userid) { return from p in dc.Powerups where p.UserId == userid select (Models.Powerups.Powerup) new DataContractSerializer(Type.G

我是LINQ表达式的新手,正在尝试让以下内容发挥作用:

public IQueryable<Models.Powerups.Powerup> GetPowerups(Guid userid)
{
    return from p in dc.Powerups
           where p.UserId == userid
           select (Models.Powerups.Powerup) new DataContractSerializer(Type.GetType(p.Type, true)).ReadObject(new XmlTextReader(new StringReader(p.Data)));
}
这显然不起作用,因为LINQ正试图将整个表达式转换为SQL


你知道怎么做吗?

最好的办法是:

public IQueryable<Models.Powerups.Powerup> GetPowerups(Guid userid)
{
        return from p in dc.Powerups
                   where p.UserId == userid
                   select p.Data;
}

然后,从数据库中获取xml后,自己反序列化它。LINQtoSQL提供程序将不知道如何将其转换为SQL,您也不希望它以任何方式转换。序列化对象的反序列化无论如何都应该在CLR中进行。

您需要将其分为两部分,第一部分从数据库中获取数据,然后在数据查询之外进行转换。您可以在C中使用自动生成的迭代器来帮助:

public IEnumerable<Models.Powerups.Powerup> GetPowerups(Guid userid)
{
  // Create the serializer here.
  DataContractSerializer s = new DataContractSerializer(typeof(Models.Powerups.Powerup));

  // Iterate through the powerups.
  foreach (var p in dc.Powerups)
  {
    // Create the string reader, xml reader, then deserialize and return
    // instance.
    using (StringReader stringReader = new StringReader(p.Data))
    using (XmlTextReader xmlTextReader = new XmlTextReader(stringReader))
    {
      // Return the deserialized instance.
      yield return (Models.Powerups.Powerup) s.ReadObject(xmlTextReader);
    }
  }
}
这方面的好处是它还允许延迟执行。

顺便说一句,您不应该再使用XmlTextReader了。改用XmlReader.Create。