SORU
1 HAZİRAN 2010, Salı


C# PredicateBuilder Varlıklar: parametre 'f' Varlıklar için belirtilen SERİ bağlı değildi sorgu ifadesi

Dinamik bir filtre oluşturmak için ihtiyacım vardı ve varlıkları kullanmaya devam etmek istedim. Bu nedenle albahari gelen PredicateBuilder kullanmak istedim.

Aşağıdaki kodu oluşturdum:

var invoerDatums = PredicateBuilder.True<OnderzoeksVragen>();
var inner = PredicateBuilder.False<OnderzoeksVragen>();

foreach (var filter in set.RapportInvoerFilter.ToList())
{
    if(filter.IsDate)
    {
        var date = DateTime.Parse(filter.Waarde);
        invoerDatums = invoerDatums.Or(o => o.Van >= date && o.Tot <= date);
    }
    else
    {
        string temp = filter.Waarde;
        inner = inner.Or(o => o.OnderzoekType == temp);
    }
}

invoerDatums = invoerDatums.And(inner);
var onderzoeksVragen = entities.OnderzoeksVragen
                               .AsExpandable()
                               .Where(invoerDatums)
                               .ToList();

Kodu çalıştırdığımda bir tarih filtresi yoktu sadece 1 filtre vardı. Yani sadece iç yüklem doluydu. Yüklem çalıştırıldığında aşağıdaki hatayı aldım.

Parametre 'f' bağlı değil ETMENİZ için Varlıklar sorgusu ifade.

Aşağıdaki page buldum bir cevap ararken. Ama bu zaten LİNQKit uygulanır.

Herkesten bu hata deneyimli ve bunu çözmek için nasıl biliyor mu?

CEVAP
2 HAZİRAN 2010, ÇARŞAMBA


Sorunu da, diğer koşullar PredicateBuilder ile yapılan kadar yapılmış koşullarına PredicateBuilder ile yapıldığında gibiydi aynı hataya rastladım,

örneğin (A VEYA B) VE (X VEYA Y) bir oluşturucu VEYA BİR B oluşturur, bir X YA da Y oluşturur ve üçüncü birlikte onları Eleştiri.

Birden fazla seviyede tanıtıldı doğrulamaları, sadece bir seviye iyi çalıştı AsExpandable ile aynı hatayı aldım.

Herhangi bir yardım bulmak mümkün değildi, ama bazı deneme yanılma yoluyla işler için bulabildim. Ben de onu takip edip bir yüklem ile aradım her zaman uzatma yöntemi Genişletin.

İşte bu kod, kolaylık için kesmek biraz:

public static IQueryable<Submission> AddOptionFilter(
    this IQueryable<Submission> query, 
    IEnumerable<IGrouping<int, int>> options)
{
    var predicate = options.Aggregate(
        PredicateBuilder.False<Submission>(),
        (accumulator, optionIds) => accumulator.Or(ConstructOptionMatchPredicate(optionIds).Expand()));
        query = query.Where(predicate.Expand());            
    return query;
}

Sorgu zaten AsExpandable adlı ConstructOptionNotMatchPredicate bir İfade döndürür olan bir IQueryable.

Hata geçmişi var bir kere kesinlikle varlık çerçevesi karşı zamanında karmaşık filtreler oluşturmak için başardık.

Düzenleme:

İnsanlar hala yorum ve bu oylama olduğundan başka bir düzeltme paylaşıyorum yani hala yararlı olduğunu düşünüyorum. Temelde aynı API vardır ama Genişletin aramalar, araştırmaya değer aslında ihtiyacı olmayan Universal Predicate Builder bu yana LinqKit ve yüklem builder kullanmayı bıraktım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alexander Johnson

    Alexander Jo

    26 Temmuz 2008
  • Ammine Getahun

    Ammine Getah

    21 HAZİRAN 2011
  • Kai Moosmann

    Kai Moosmann

    5 Temmuz 2006