【问题标题】:DataContractSerializer within LINQ to SQL expression?LINQ to SQL 表达式中的 DataContractSerializer?
【发布时间】:2009-01-22 21:00:42
【问题描述】:

我是 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。

你知道怎么做吗?

【问题讨论】:

  • 顺便说一句,你不应该再使用XmlTextReader。请改用XmlReader.Create()

标签: c# linq-to-sql iqueryable datacontractserializer


【解决方案1】:

最好的办法是这样做:

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

然后在从数据库中取回 xml 后自行反序列化。 LINQ to SQL 提供程序不知道如何将其转换为 SQL,而且您也不希望它这样做。序列化对象的反序列化无论如何都应该发生在 CLR 中。

【讨论】:

    【解决方案2】:

    您需要将其分为两部分,第一部分从数据库中获取数据,然后在该查询之外进行数据转换。您可以在 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);
        }
      }
    }
    

    这样做的好处是它还允许延迟执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多