Как бы я сериализовал отложенный список LINQ-to-SQL - PullRequest
6 голосов
/ 05 ноября 2008

У меня есть запрос linq, и я пытаюсь поместить его в сериализуемый объект для распределенного кэширования (Velocity), но он не выполняется из-за отложенного списка LINQ-to-SQL

вроде так

  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 - это тот же класс, который Роб Конери использует в своей витрине MVC ...

все три класса помечены как сериализуемые (MemberBlogs, MemberBlogCategories, LazyList ... есть идеи?

Ответы [ 4 ]

6 голосов
/ 05 ноября 2008

Если вы помещаете его в распределенный кеш, вам нужно вообще избегать LazyList. Затем вы можете вызывать .ToList () для всего оператора LINQ, как в:

(from x select new MemberBlogs).ToList()

Это затем должно быть кэшируемым, поскольку оно заставляет запросы оцениваться.

3 голосов
/ 05 ноября 2008

Я просто догадываюсь, но я бы сказал, что проблема в том, что он сериализует запрос вместо результатов; Я не знаю, как выглядит реализация LazyList, но вы, вероятно, можете добавить метод OnSerializing, который фактически выполняет запрос перед его сериализацией; Что-то вроде:

[OnSerializing]
private void ExecuteLinqQuery(StreamingContext context)
{
    if (!SomethingThatIndicatesThisLinqQueryHasNotBeenExecuted)
        LinqVariable.ToList()
}

Таким образом, вы сохраняете Lazy Load (для всего, что не попадает в ваш кеш), но также, если оно попадает в кеш, он выполняет запрос linq и кэширует результаты.

2 голосов
/ 05 ноября 2008

Если вы кешируете его, почему вы используете ленивый список? Не используйте ленивый список, используйте кэширование, и проблема исчезнет.

0 голосов
/ 08 октября 2013

Я знаю, что это старая запись, но у меня возникла та же проблема, что и для запуска LazyList и помещения его в кэш AppFabric. Я закончил тем, что поместил некоторую собственную логику сериализации в тип LazyList.

Первая часть теперь выглядит так:

 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...