Kullanıcının seçebileceği bir filtre seti sağlamak istiyorum ve her filtre bir Expression<Func<X, bool>>
'a karşılık gelecektir. Bu yüzden, kullanılabilir öğelerin ('Joe', 'Steve', 'Pete' vb.) Dinamik bir listesini almak ve bu adlara dayalı olarak "kodlanmış" filtrelerden oluşan bir koleksiyon oluşturmak ve kullanıcının seçmesine izin vermek isteyebilirim hangi filtreleri kullanmak ister. Sorunum, dinamik listeden bir dize değerine dayanarak ifademi "sabit kodlamaya" çalıştığımda bile, ifadenin değeri, bana göre, bana görünen, anonim bir türden asılı bir özellik olarak saklanmasıdır (ve Anon türünü nasıl serileştireceğimi bilmiyorum). Üzgünüm, bu kafa karıştırıcıysa, bunun nasıl telaffuz edileceğinden emin değilim.LINQ: Değer temelli referans nasıl zorlanır?
İşte benim örnek kod:
public class Foo
{
public string Name { get; set; }
}
static void Main(string[] args)
{
Foo[] source = new Foo[]
{
new Foo() { Name = "Steven" } ,
new Foo() { Name = "John" } ,
new Foo() { Name = "Pete" },
};
List<Expression<Func<Foo, bool>>> filterLst = new List<Expression<Func<Foo, bool>>>();
foreach (Foo f in source)
{
Expression<Func<Foo, bool>> exp = x => x.Name == f.Name;
filterLst.Add(exp);
}
}
}
Benim sorunum benim ifade vücutta baktığınızda baktığınızda aşağıdaki gibi okur olmasıdır:
(x.Name = value(ConsoleApplication1.Program+<>c__DisplayClass3).value)
Ne, ne zaman gerçekten Bunun için kodumu değiştirirsem
(yerine, o kesin var
(x.Name = "Steven")
: Birincisi böyle okumak için istediğiniz olduğu ly ne alıyorum:
Expression<Func<Foo, bool>> exp = x => x.Name == "Steven";
)
ben İfade içine yapışmasını önce yerel bir dize değerine benim değer zorlama denedim ama işe görünmüyor:
List<Expression<Func<Foo, bool>>> filterLst = new List<Expression<Func<Foo, bool>>>();
foreach (Foo f in source)
{
string value = f.Name;
Expression<Func<Foo, bool>> exp = x => x.Name == value;
filterLst.Add(exp);
}
Bir dizeye bildirilen yerel bir değişken kullanıyorum bile, neden (veya gerçekten nasıl) hala anonim bir türe baktığını anlamıyorum. Bu işi istediğim gibi yapmanın bir yolu var mı?
(expression-tree yapısını göstermek için yanıt güncellendi) –
Bize daha karmaşık bir senaryoyu basitleştiriyor musunuz? Bir dizi nesne özelliğini filtrelemenin daha kolay yolları vardır. –
@Jonas: Evet, gerçek senaryonumu biraz basitleştirdim. Her zaman Name özelliğini sabit bir dizeye karşı filtrelemeyi gerçekten istemiyorum; Aslında daha karmaşık nesnelerle uğraşıyorum ve kullanıcıya farklı özellikler veya çoklu özellik koşullarına dayanan birkaç "filtre" koleksiyonunu veriyorum. Nihayetinde, bu "filtreler" in tümü, bir sorgu oluşturmak için bir IQueryable kaynak listesine eklediğim aynı nesne tipine (İfade) soyutlanır. –
Steven