2013-08-19 32 views
5

Ben dinamik linq select deyimi bir işlevi çağırmak için çalışıyorum, ancak im hata alıyorum:Çağrı fonksiyonu

No property or field 'A' exists in type 'Tuple2' 

örnek kod:

void Main() 
{ 
    var a = new Tuple<int, int>(1,1); 
    var b = new[]{ a }; 
    var q = b.AsQueryable().Select("A.Test(it.Item1)"); 

    q.Dump(); 
} 

public static class A 
{ 
    public static int Test(int i) 
    { 
     return i++; 
    } 
} 

nasıl değiştirmeliyim benim Bu çalışma için kod?

Örneğin, Convert.ToInt32 işlevinde yerleşik olarak adlandırılırsa, iyi çalışır.

var q = b.AsQueryable().Select("Convert.ToInt32(it.Item1)"); 

Ayrıca dinamik linq kullanarak bir özelliği nasıl yayınlarım?

var q = b.AsQueryable().Select("((float)it.Item1)"); 
+0

"Enumerable.Select" yönteminde bir dize kullandığınız nokta nedir? –

+0

@Bob. Etiketlerde yazılı: Dinamik-linq – xanatos

cevap

8

Ben dynamic-linq bunları yapmak kadar "güçlü" olmadığını söylerim. Bu tür DateTime

liste açıkça, Math, Convert, çeşitli baz tipleri (int, float, string, ...), Guid, Timespan: Sadece verilen nesnelerde yöntemleri ve bazı özel sınıflar arar Dosyada ilspy/reflector kullanıyorsanız görünür. System.Linq.Dynamic.ExpressionParser.predefinedTypes'dalar.

Şimdi, açıkça yanlış olabilir, ama bu işleri:

.Select("Guid.NewGuid().ToString()").Cast<string>().ToArray() o "doğru" listesidir kuvvetle muhtemeldir olduğunu gösteren.

bir makalede http://www.krizzcode.com/2012/01/extending-dynamiclinq-language.html

Şimdi, zeki bir adam dinamik linq kaynağını alacağını ve basitçe bu diziyi genişletmek ilginizi çekiyorsa Dinamik LINQ nasıl değiştirileceğini burada yoktur ... Ama burada orada değil zeki erkekler ...kan kanı isteyen sadece programcılar var! Kan ama özellikle ! Dinamik Linq (ilk yöntemleri çağırmak sonra/Bu tür özellikleri önbelleğe çünkü)

Açıklama için ilk çağrı ÖNCE (istediğiniz türleri ile)

var type = typeof(DynamicQueryable).Assembly.GetType("System.Linq.Dynamic.ExpressionParser"); 

FieldInfo field = type.GetField("predefinedTypes", BindingFlags.Static | BindingFlags.NonPublic); 

Type[] predefinedTypes = (Type[])field.GetValue(null); 

Array.Resize(ref predefinedTypes, predefinedTypes.Length + 1); 
predefinedTypes[predefinedTypes.Length - 1] = typeof(A); // Your type 

field.SetValue(null, predefinedTypes); 

yapın: Biz yansıma kullanmak eklemek bu "özel liste" ye bizim nesnemiz. Benim için

+0

Eğer bir öneri olsaydı cevap yerine .... – andy

+1

@andy Bunun mümkün olmadığı bir cevap hala bir cevap – xanatos

+0

@xanatos – Magnus

0
var b = new[]{ a }; 

yukarıdaki dizi dizinin ne tür bilmiyorum, ve güvenli yazın değil mi? o tamsayı değeri (ı dize değeri düşünüyorum) değil yani

Kişisel değerler varyant veri türü atanır, kendi sınıf parametre veri türü tamsayı olduğu için) (Convert.ToInt32 gerekir gerekir Sorgunuzda bu değerleri aldığımda

(kalın) burada o

var b = new **int**[]{ a }; 

yerine var b = new[]{ a };

önemli ipucu olduğunu deneyin:

No property or field 'xxx' exists in **type** 'xxx' 

Ve önceki tartışma için bu bakınız: Benim için derlemek gelmez Select s bir dize kullanarak sayede

Dynamic Linq - no property or field exists in type 'datarow'

0
ben karışabilir

ancak sözdizimi. Aşağıdaki sözdizimi çalışır:

var q = b.AsQueryable().Select(it => A.Test(it.Item1)); 
+1

'Seçimleriniz benim için derleme yapmıyor çünkü OP dinamik linq kullanıyor http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part -1-using-the-linq-dynamic-query-library.aspx – I4V

+0

Ah bu yüzden kafam karıştı :) –

0

aşağıdaki çalışır:

var a = new Tuple<int, int>(1, 1); 
var b = new[] { a }; 
var q = b.AsQueryable().Select(it=>A.Test(it.Item1)); 
var q1 = b.AsQueryable().Select(it => Convert.ToInt32(it.Item1)); 
var q2 = b.AsQueryable().Select(it => (float) it.Item1); 
6

Orada bu konuda kabul edilen bir yanıt zaten ama benim için işe yaramadı biliyorum. Dinamik Linq 1.1.4 kullanıyorum. Ben GetNewestRisk() $ ile temsil nesne üzerinde bir kamu yöntemdir bu

$.GetNewestRisk() == null 

gibi bir sorgu yapmak istedim. Bu hatayı almaya devam ettim "Sorgulama çalıştırılırken hata oluştu, 'Hasta' türündeki yöntemler erişilebilir değil (dizin 2'de)".

Kaynak kodunda, çalışmak istediğiniz tüm türlerin tutulacağı bir özel sağlayıcı atanmasına izin veren bir GlobalConfig nesnesi var. Ben onu kullanıyorum nasıl İşte

public class CustomTypeProvider: IDynamicLinkCustomTypeProvider 
{ 
    public HashSet<Type> GetCustomTypes() 
    { 
     HashSet<Type> types = new HashSet<Type>(); 
     types.Add(typeof(Patient)); 
     types.Add(typeof(RiskFactorResult)); 
     types.Add(typeof(PatientLabResult)); 
     types.Add(typeof(PatientVital)); 
     return types; 
    } 
} 

edilir: Burada, özel sağlayıcı kaynak kodu ben ifadenin içinde nesneler üzerinde yöntemleri çağırmak mümkün duyuyorum

System.Linq.Dynamic.GlobalConfig.CustomTypeProvider = new CustomType(); 

bu çağrıyı yaptıktan sonra.

+0

Bu cevabı System.Linq.Dynamic.Core'a uyarlayabildim. Aynı arabirime sahip, ancak aynı zamanda, global olarak özel türleri uygulamak yerine, tek tek ifadelere tür sağlamanıza olanak veren ParsingConfig'e de sahip. – Kent