1

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

你知道这样做的方法吗?

4

2 回答 2

0

最好的办法是这样做:

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 中。

于 2009-01-22T21:05:26.460 回答
0

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

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

于 2009-01-22T21:08:39.447 回答