Итак, это может показаться крайним случаем, но мне просто интересно, возможно ли это. У меня есть комбинация статического набора и отложенного набора, завернутого в IEnumerable
, например:
public IEnumerable<T> MakeMyQuery<T>()
{
// returns a List<T>
var someStaticData = LoadMyStaticDataFromDatabase();
// Returns IEnumerable<T>, but from another resource
var deferredQuery = CreateADeferredQueryUsingYieldReturn();
return someStaticData.Concat(deferredQuery);
}
Итак, что здесь происходит, так это то, что когда я вызываю .Take(someNumber)
для моего перечисляемого, он сначала возвращает элементы из моих статических данных, прежде чем пытаться оценить отложенный компонент - фактически я «спрятал» некоторые потенциально трудоемкие задачи за перечисляемым, так что если Мне никогда не нужно получать эти элементы, они на самом деле никогда не оцениваются из-за отложенного характера LINQ.
Однако я не думаю, что можно кэшировать этот запрос для последующего использования (я не верю, что состояние итератора будет храниться в кеше, верно?) Или есть простой способ сделать это без перечисления результатов в спасти?
В идеале мой поток был бы таким:
public List<T> SomeMethod<T>(int numberOfGuys)
{
IEnumerable<T> query = null;
if(// Is in Cache)
query = Cache["MyQuery"];
else
{
query = MakeMyQuery();
Cache["MyQuery"] = query;
}
return query.Take(numberOfGuys).ToList();
}
Таким образом, я могу повторно использовать один и тот же запрос снова и снова для запроса данных, но, возможно, мне никогда не придется повторно запрашивать БД. Есть ли способ сделать это?
LoadMyStaticDataFromDatabase
? Это кажется независимым от того, как вы объединяете его с другими данными. - person default.kramer   schedule 16.02.2013