/// <summary>
 /// Locates users by combining boths filters
 /// </summary>
 /// <param name="d"></param>
 /// <param name="d2"></param>
 /// <param name="r"></param>
 /// <returns></returns>
 public UserProfile2Contract[] FindUserProfile(UserProfile2Discriminator d, UserProfileVsLocationDiscriminator d2, RoleDiscriminator r)
 {
     try
     {
         using (var records = RepositoryFactory.GetUserProfile())
         {
             records.Discriminator2 = d;
             records.UserProfileVsLocationFilter = d2;
             records.RoleFilter = r;
             //Debug.WriteLine(records.Count());
             return(records.Select(x => new UserProfile2Contract()
             {
                 UserProfile2 = x as DB.UserProfile
             }).ToArray());
         }
     }
     catch (Exception ex)
     {
         HandleMyException(ex);
         return(null);
     }
 }
        public UserAndProductsContarct[] FindLastUsedProducts(UserProfile2Discriminator u, UserProfileVsLocationDiscriminator pvl)
        {
            //TODO: it is not matching how it is implemented in the ProductRepository
            try
            {
                var userRecords = RepositoryFactory.GetUserProfile();
                userRecords.Discriminator2 = u;
                userRecords.UserProfileVsLocationFilter = pvl;

                var ret = userRecords.OfType <DB.UserProfile>()
                          .Select(p => new UserAndProductsContarct()
                {
                    UserProfile = p,
                    Products    = p.ProfileCredits.OrderByDescending(pc => pc.HasBallance).ThenByDescending(pc => pc.CalculatedTime).ThenByDescending(pc => pc.Product.CreditTransactions.Count).Take(Settings.Default.NumberOfLastProductsToShow)
                                  .Select(pc => new ProductCreditContract()
                    {
                        Product       = pc.Product,
                        ProfileCredit = pc
                    }).ToArray()
                }).ToArray();


                foreach (var r in ret)
                {
                    DB.UserProfile profile = (DB.UserProfile)userRecords.Result2.First(z => z.UserId == r.UserProfile.UserId);
                    IQueryable <DB.CreditTransaction> transactions = profile.CreditTransactions.AsQueryable();
                    if (pvl != null && pvl.Filter != null)
                    {
                        var locations = MDB.UserProfileVsLocations.Where(pvl.Filter);
                        transactions = transactions.Join(locations,
                                                         location => location.LocationId,
                                                         transaction => transaction.LocationId,
                                                         (transaction, location) => transaction
                                                         );
                    }
                    var lastTransaction = transactions.LastOrDefault();
                    if (lastTransaction != null)
                    {
                        var lastPayment = lastTransaction.Payments.LastOrDefault();
                        if (lastPayment != null)
                        {
                            r.LastPayment = lastPayment;
                        }
                        else
                        {
                            //TODO: replace mocked-up payment with location-settings driven data
                            r.LastPayment = new PaymentImplementor {
                                Amount = lastTransaction.BallanceUnits * lastTransaction.Product.ProductPriceHistories.OrderByDescending(p => p.ChangeDate).First().Price
                            };
                        }
                    }
                }

                return(ret);
            }
            catch (Exception ex)
            {
                HandleMyException(ex);
                return(null);
            }
        }