Bir veritabanında "nerede" ifadesi olarak geçmek için bazı kod oluşturma ifadeleri var ve bazı şeyleri hızlandırmaya çalışıyorum. gerçek bir şey için tabloyu almaya kodu -Önceden var olan bir BinaryExpression içinde bir ConstantExpression değerinin değiştirilmesi
private Expression MakeWhereForPK(int id)
{
var paramExp = Expression.Parameter(typeof(Brand),"b");
//Expression to get value from the entity
var leftExp = Expression.Property(paramExp,"ID");
//Expression to state the value to match (from the passed in variable)
var rightExp = Expression.Constant(id,typeof(int));
//Expression to compare the two
var whereExp = Expression.Equal(leftExp,rightExp);
return Expression.Lambda<Func<Brand,bool>>(whereExp,paramExp);
}
yukarıdaki soru için basitleştirme geçerli:
Bu örnek, aşağıda açıklamada değerindeki geçirilen bir bir tablonun PK maç için nerede bir hale getirir sorgulamak ve bulmak onun PK vb etkili bir genellikle kodda yapabilir aynı şeyi yapıyor: buldum işleri biraz optimize etmek testine yaparken,
ctx.Brands.Where(b => b.ID = id);
Bu Tamam çalışır, ancak onun Oldukça yavaş - yukarıdaki 1000000 kez yapmak, yaklaşık 25 sn sürer. Yukarıdaki son satırı atlarsanız daha iyi (ama tabii ki işe yaramaz!), Bu yüzden zamanın 2/3rds alma, ancak geri kalan büyük değil Expression.Lamba gibi görünüyor.
tüm sorguları Ben bir IN
stil ifadesi çevirmek ve bir kez oluşturmak, ama ne yazık ki yukarıdaki kuşağının en tasarruf etmektir için umduğum şey, mümkün değildir olabilir kerede ne olacak olsaydı, ve sadece oluşturulan ifadeyi yeniden kullanın, ancak id
farklı bir değerde iletin.
Bu, Linq'e iletileceğinden, bu ifadeyi, çağrıda iletebileceğim bir tamsayı parametresine sahip olacak şekilde derleyemiyorum - ifade ağacı olarak kalmalıdır.
Expression<Func<Brand,bool>> savedExp;
private Expression MakeWhereForPKWithCache(int id)
{
if (savedExp == null)
{
savedExp = MakeWhereForPK(id);
}
else
{
var body = (BinaryExpression)savedExp.Body;
var rightExp = (ConstantExpression)body.Right;
//At this point, value is readonly, so is there some otherway to "inject" id,
//and save on compilation?
rightExp.Value = id;
}
return savedExp;
}
nasıl sadece id farklı bir değerle, ifadeyi yeniden kullanabilirsiniz:
Yani şu zamanlama egzersiz yapmak amacıyla bir basit versiyonu olabilir?
bir fikirdir [a kullanmayı olurdu
Bu kod yaklaşık 500 × hızlıdır 'ConstantExpression' yerine' ParameterExpression'] (http://msdn.microsoft.com/en-us/library/system.linq.expressions.parameterexpression.aspx)? (Btw, performans bir sorun ise, neden LINQ kullanıyoruz? LINQ, SQL öğrenmek zorunda kalmamak için performans gösteriyor.) – Andomar
@Andomar: ikinci 'ParameterExpression' 'Func' yapacaktır. 'Ner' için bir yük olarak kullanılamaz. –
Dennis