DataContractSerializer в выражении LINQ to SQL? - PullRequest
1 голос
/ 23 января 2009

Я новичок в выражениях 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.

Вы знаете, как это сделать?

Ответы [ 2 ]

0 голосов
/ 23 января 2009

Вам нужно разбить это на две части: сначала получить данные из базы данных, а затем преобразовать данные за пределы этого запроса. Вы можете использовать автоматически сгенерированные итераторы в 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);
    }
  }
}

Самое замечательное в этом то, что он допускает и отложенное выполнение.

0 голосов
/ 23 января 2009

Лучше всего сделать это:

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.

...