2009-12-03 21 views
5

Burada tartışılan yöntem hakkında bilgi:Derlenmiş bir LINQ sorgusu ve DataLoadOptions ... bir twist ile!

Solving common problems with Compiled Queries in Linq to Sql for high demand ASP.NET websites

... ama bir olsun bu benim durum için çalışmıyor: Yük seçeneklerini ayarlama

" sonuçlarına sonra izin verilmez

var bir sorgudan döndü. "

Tarafların ve yönetici kodu oluşturmak için CodeSmith PLINQO komut dosyalarını kullanıyorum ve yönetici kod şöyle görünür:

: Ben ilk böyle Searchmanager sınıfa statik DataLoadOptions silmeye çalıştık

public partial class SearchManager 
{  
    #region Query 
    // A private class for lazy loading static compiled queries. 
    private static partial class Query 
    { 
     internal static readonly Func<MyDataContext,IOrderedQueryable<Search>> 
      GetAll = CompiledQuery.Compile(
       (MyDataContext db) => 
       from s in db.Search 
       orderby s.Name 
       select s); 
    } 
    #endregion 


    public IQueryable<Search> GetAll() 
    { 
     return Query.GetAll(Context); 
    } 
} 

public IQueryable<Search> GetAll() 
{ 
    Context.LoadOptions = MyOptions; 
    return Query.GetAll(Context); 
} 
:
public static readonly DataLoadOptions MyOptions = 
    (new Func<DataLoadOptions>(() => 
    { 
     var option = new DataLoadOptions(); 
     option.LoadWith<Search>(x => x.Rule); 
     return option; 
    }))(); 

... o gibi getAll yönteminde Bağlamında bunu sağlayan

... ve bu bana yukarıda belirttiğim hatayı verdi. Bu, sorgunun zaten derlenmiş olması ve bu nedenle "fazladan" DataLoadOptions'ın eklenememesi nedeniyle mi? Öyleyse, derlenmekte olan sorgudan önce DataLoadOptions'ı uygulamak nasıl mümkün olabilir?

+0

onay yayınlanmıştır cevap ve aslında hata sorgu çağrılmadan önce meydana Eğer –

cevap

0

Hata mesajının kendisi size tam olarak neyin yanlış olduğunu bildirir. Bir Linq sorgusu sonuçları döndürdikten sonra DataLoadOptions uygulayamazsınız. Ya da belki de bunu söylemenin daha iyi bir yolu şöyledir. DataLoadOptions'ı uygulamak istiyorsanız, sorguyu yürütmeden önce bunu yapın. Bunu sonra yapamazsın.

+0

istediğiniz bilgi var ise görüldüğü gibi, onu kabul yapın: kamu IQueryable getAll() { Context.LoadOptions = MyOptions; döndürme Query.GetAll (Bağlam); } – krisg

0

Derlenmiş bir sorgu için yalnızca yükleme seçeneklerini ayarlayabilirsiniz. Hata ikinci çağrıya atılıyor olmalı. Ödevi statik bir yapıcıya taşıyın ve sorununuzu çözmeniz gerekir.

0
public IQueryable<Search> GetAll() { 
    Context.LoadOptions = MyOptions; 
    return Query.GetAll(Context); 
} 

İçindekiler herhangi bir sorgu sonucu döndürdüyse, bu atama çok geç. Bunun, derlenmiş sorgularla ve DataContext'in LoadOptions özelliğini atayarak yapılması gereken hiçbir şey yoktur. Ne yazık ki, LoadOptions özelliğinin bu davranışı msdn'de belgelenmiyor.

2

DataContext sınıfının ayarlayıcı özelliğinde, DataContext'in Önbelleğindeki herhangi bir nesneye sahip olup olmadığını ve LoadOptions öğesinin boş DEĞİLDİR ve yükleme yapmaya çalıştığınız LoadOptions örneğinin aynı olmadığını belirten bir koşul vardır. zaten ayarlanmış olan, o zaman bu istisna var.

Alternatif # 1. Her sorgu için yeni bir Bağlam oluştur (muhtemelen iyi bir fikir değil)
Alternatif # 2. Yansıma kullanarak ClearCache yöntemini çağırın, sonra statik olarak yeni bir LoadOptions oluşturun, bunu Bağlam öğesine atayın ve son olarak derlenmiş sorguyu alın.

public partial class SearchManager 
{  
    #region Query 
    // A private class for lazy loading static compiled queries. 
    private static partial class Query 
    { 
     internal static readonly Func<MyDataContext,IOrderedQueryable<Search>> GetAll 
     { 
      get { 
       return CompiledQuery.Compile(
        (MyDataContext db) => 
         from s in db.Search 
         orderby s.Name 
         select s); 
      } 
     } 
    #endregion 

    public IQueryable<Search> GetAll() 
    { 
     Context.ClearCache(); 
     Context.LoadOptions = MyOptions; 
     return Query.GetAll(Context); 
    } 

    public static readonly DataLoadOptions MyOptions = 
     (new Func<DataLoadOptions>(() => MakeLoadOptions<Search>(x=>x.Rule)))(); 
} 

public static class Extensions { 
    public static void ClearCache(this DataContext context) 
    { 
     const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; 
     var method = context.GetType().GetMethod("ClearCache", FLAGS); 
     method.Invoke(context, null); 
    } 

    public static DataLoadOptions MakeLoadOptions<TEntity, TResult>(this Expression<Func<TEntity,TResult>> func) { 
     DataLoadOptions options = new DataLoadOptions(); 
     options.LoadWith(func); 
     return options; 
    } 
} 
İlgili konular