"Связанный подзапрос" (т.е. тот, в который, где условие зависит от значений, полученных из строк содержания запроса) выполнится однажды для каждой строки. Несвязанный подзапрос (тот, в который, где условие независимо от содержания запроса) выполнится однажды вначале. Механизм SQL делает это различие автоматически.
, Но, да, объяснять-план предоставит Вам грязную подробную информацию.
Вы не можете сделать это автоматически, но вы можете получить 95% бесплатно. Это классический случай аспектно-ориентированного программирования . Посмотрите PostSharp , в котором есть класс OnFieldAccessAspect
. Вот как вы можете решить вашу проблему:
[Serializable]
public class FieldLogger : OnFieldAccessAspect {
public override void OnGetValue(FieldAccessEventArgs eventArgs) {
Console.WriteLine(eventArgs.InstanceTag);
Console.WriteLine("got value!");
base.OnGetValue(eventArgs);
}
public override void OnSetValue(FieldAccessEventArgs eventArgs) {
int i = (int?)eventArgs.InstanceTag ?? 0;
eventArgs.InstanceTag = i + 1;
Console.WriteLine("value set!");
base.OnSetValue(eventArgs);
}
public override InstanceTagRequest GetInstanceTagRequest() {
return new InstanceTagRequest("logger", new Guid("4f8a4963-82bf-4d32-8775-42cc3cd119bd"), false);
}
}
Теперь все, что наследуется от FieldLogger, будет вести себя так же. Presto!
Я не верю, что это возможно сделать декларативно, я никогда не видел, чтобы это делалось таким образом. Что вы можете сделать, так это реализовать интерфейс INotifyPropertyChanged в своем базовом классе и иметь реализацию интерфейса в базовом классе. Примерно так:
public class A : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
protected virtual void RaiseOnPropertyChanged(object sender, string propertyName)
{
if (this.PropertyChanged != null)
PropertyChanged(sender, new PropertyChangedEventArgs(propertyName);
}
public A()
{
this.PropertyChanged += new PropertyChangedEventHandler(A_PropertyChanged);
}
void A_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
//centralised code here that deals with the changed property
}
}
public class B : A
{
public string MyProperty
{
get { return _myProperty; }
set
{
_myProperty = value;
RaiseOnPropertyChanged(this, "MyProperty");
}
}
public string _myProperty = null;
}