C# LINQ to SQL表达式中的DataContractSerializer?
我是LINQ表达式的新手,正在尝试让以下内容发挥作用: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
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。