asp.net - net - ¿Cómo serializaría una lista perezosa LINQ-to-SQL?
update linq c# mvc (4)
Si lo está almacenando en la memoria caché, ¿por qué está utilizando una lista perezosa? No use una lista perezosa, use almacenamiento en caché y el problema desaparecerá.
Tengo una consulta de linq y estoy tratando de poner eso en un objeto serializable para un almacenamiento en caché distribuido (Velocity) pero está fallando debido a una lista de perezosos LINQ-to-SQL
al igual que
return from b in _datacontext.MemberBlogs
let cats = GetBlogCategories(b.MemberBlogID)
select new MemberBlogs
{
MemberBlogID = b.MemberBlogID,
MemberID = b.MemberID,
BlogTitle = b.BlogTitle,
BlogURL = b.BlogURL,
BlogUsername = b.BlogUsername,
BlogPassword = b.BlogPassword,
Categories = new LazyList<MemberBlogCategories>(cats)
};
LazyList es la misma clase que Rob Conery usa en su tienda MVC ...
las tres clases están marcadas como serializables (MemberBlogs, MemberBlogCategories, LazyList ... ¿alguna idea?
Si lo está colocando en un caché distribuido, deberá evitar el LazyList por completo. A continuación, puede llamar a .ToList () alrededor de toda la instrucción LINQ como en:
(from x select new MemberBlogs).ToList()
Esto debería ser cachable porque obliga a evaluar las consultas.
Solo estoy adivinando, pero diría que el problema es que está serializando la consulta en lugar de los resultados; No sé cómo es la implementación de LazyList, pero probablemente puedas agregar un método OnSerializing que realmente ejecute la consulta antes de serializarla; Algo como:
[OnSerializing]
private void ExecuteLinqQuery(StreamingContext context)
{
if (!SomethingThatIndicatesThisLinqQueryHasNotBeenExecuted)
LinqVariable.ToList()
}
De esta forma puedes mantener la Carga diferida (para cualquier cosa que no entre en tu caché), pero también si golpea la caché, ejecutará la consulta de linq y almacenará en caché los resultados.
Sé que esta es una publicación anterior, pero tuve el mismo problema que quería ejecutar mi LazyList y ponerlos en la caché de la aplicación. Terminé poniendo alguna lógica de serialización personalizada en el tipo LazyList.
La primera parte ahora se ve así:
public class LazyList<T> : IList<T>, ISerializable
{
public LazyList()
{
this.query = new List<T>().AsQueryable();
}
public LazyList(SerializationInfo info, StreamingContext context)
{
try {
this.inner = (List<T>)info.GetValue("InnerList", typeof(List<T>));
}
catch (Exception ex)
{
this.inner = null;
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
if (this.inner != null)
info.AddValue("InnerList", this.inner.ToList());
}
public LazyList(IQueryable<T> query)
{
this.query = query;
}
public LazyList(List<T> l)
{
inner = l;
}
}