public void PotentialMatchesSearchExecute(PotentialClientMatchesState state)
        {
// ReSharper disable InconsistentNaming
            Proc Sponsor_New_Search = null;

// ReSharper restore InconsistentNaming
            switch (state.FieldType)
            {
            case PotentialMatchFieldType.SSN:
                Sponsor_New_Search          = new Proc("Sponsor_New_SearchSSN");
                Sponsor_New_Search["@SSN1"] = state.ClientRow["SSN1"];
                Sponsor_New_Search["@SSN2"] = state.ClientRow["SSN2"];
                Sponsor_New_Search["@SSN3"] = state.ClientRow["SSN3"];
                break;

            case PotentialMatchFieldType.Name: Sponsor_New_Search = new Proc("Sponsor_New_SearchName");
                Sponsor_New_Search["@FirstName"] = state.ClientRow["FName"];
                Sponsor_New_Search["@LastName"]  = state.ClientRow["LName"];
                break;
            }
            Debug.Assert(Sponsor_New_Search != null, "Sponsor_New_Search != null");

            using (Sponsor_New_Search)
            {
                Sponsor_New_Search["@MatchType"] = string.Format("Matched on {0} {1}",
                                                                 state.ClientRow.Field <bool>("IsSponsor") ? "Sponsor" :
                                                                 state.ClientRow.Field <bool>("IsSpouse") ? "Spouse" :
                                                                 "Dependent",
                                                                 state.FieldType);

                Sponsor_New_Search.ExecuteDataSet();

                // if this is the first time through, just take sproc result as our backdrop table
                if (PotentialClientMatches == null)
                {
                    Sponsor_New_Search.Table0.Columns.Add("RecordCountId", typeof(int)); //backdrop table's RecordCount has to be a real value since a computed Count() would always be the same for all rows in this table
                    foreach (DataRow r in Sponsor_New_Search.Table0.Rows)
                    {
                        r["RecordCountId"] = Sponsor_New_Search.Table0.Rows.Count;                                         //fyi, can't use expression based count column because that would reflect the total rows
                    }
                    PotentialClientMatches = new DataView(Sponsor_New_Search.Table0)
                    {
                        Sort = "RecordCountId, LName, FName"
                    };
                    //sort by ascending RecordCount so that the more specific matches are at the top
                }
                else //otherwise, just keep merging new results into the backdrop table
                {
                    // clear out any existing match rows of the same match type, because each NewMatches batch of the same type should be considered an entirely new list of hits specific to the most recent inputs
                    using (var v = new DataView(PotentialClientMatches.Table))
                    {
                        v.RowFilter = String.Format("MatchType = '{0}'", Sponsor_New_Search["@MatchType"]);
                        v.DetachRowsAndDispose(true);
                    }

                    Sponsor_New_Search.Table0.Columns.Add("RecordCountId", typeof(int), "Count(LName)"); //bring the new rows in with their own count
                    PotentialClientMatches.Table.Merge(Sponsor_New_Search.Table0);
                }
            }
        }
 public void PotentialMatchesSearchCompleted(PotentialClientMatchesState state)
 {
     //nugget: there is something about this approach where the bound DataGrid was tough to get to populate
     //        my best guess is that it's because the PotentialClientMatches backing table gets updated on a background thread
     //        i thought it was a recommended approach to fill the bound ItemsSource however (background or not) and expect the UI to auto refresh
     OnPropertyChanged("PotentialClientMatches");
 }
    public void PotentialMatchesSearchExecute(PotentialClientMatchesState state)
    {
// ReSharper disable InconsistentNaming
      Proc Sponsor_New_Search = null;
// ReSharper restore InconsistentNaming
      switch (state.FieldType)
      {
        case PotentialMatchFieldType.SSN:
          Sponsor_New_Search = new Proc("Sponsor_New_SearchSSN");
          Sponsor_New_Search["@SSN1"] = state.ClientRow["SSN1"];
          Sponsor_New_Search["@SSN2"] = state.ClientRow["SSN2"];
          Sponsor_New_Search["@SSN3"] = state.ClientRow["SSN3"];
          break;
        case PotentialMatchFieldType.Name: Sponsor_New_Search = new Proc("Sponsor_New_SearchName");
          Sponsor_New_Search["@FirstName"] = state.ClientRow["FName"];
          Sponsor_New_Search["@LastName"] = state.ClientRow["LName"];
          break;
      }
      Debug.Assert(Sponsor_New_Search != null, "Sponsor_New_Search != null");

      using (Sponsor_New_Search)
      {
        Sponsor_New_Search["@MatchType"] = string.Format("Matched on {0} {1}",
          state.ClientRow.Field<bool>("IsSponsor") ? "Sponsor" :
            state.ClientRow.Field<bool>("IsSpouse") ? "Spouse" :
              "Dependent",
          state.FieldType);

        Sponsor_New_Search.ExecuteDataSet();

        // if this is the first time through, just take sproc result as our backdrop table
        if (PotentialClientMatches == null)
        {
          Sponsor_New_Search.Table0.Columns.Add("RecordCountId", typeof(int)); //backdrop table's RecordCount has to be a real value since a computed Count() would always be the same for all rows in this table
          foreach (DataRow r in Sponsor_New_Search.Table0.Rows) r["RecordCountId"] = Sponsor_New_Search.Table0.Rows.Count; //fyi, can't use expression based count column because that would reflect the total rows 
          PotentialClientMatches = new DataView(Sponsor_New_Search.Table0) {Sort = "RecordCountId, LName, FName"};
          //sort by ascending RecordCount so that the more specific matches are at the top
        }
        else //otherwise, just keep merging new results into the backdrop table
        {
          // clear out any existing match rows of the same match type, because each NewMatches batch of the same type should be considered an entirely new list of hits specific to the most recent inputs
          using (var v = new DataView(PotentialClientMatches.Table))
          {
            v.RowFilter = String.Format("MatchType = '{0}'", Sponsor_New_Search["@MatchType"]);
            v.DetachRowsAndDispose(true);
          }

          Sponsor_New_Search.Table0.Columns.Add("RecordCountId", typeof(int), "Count(LName)"); //bring the new rows in with their own count
          PotentialClientMatches.Table.Merge(Sponsor_New_Search.Table0);
        }
      }

    }
 public void PotentialMatchesSearchCompleted(PotentialClientMatchesState state)
 {
   //nugget: there is something about this approach where the bound DataGrid was tough to get to populate
   //        my best guess is that it's because the PotentialClientMatches backing table gets updated on a background thread
   //        i thought it was a recommended approach to fill the bound ItemsSource however (background or not) and expect the UI to auto refresh
   OnPropertyChanged("PotentialClientMatches");
 }