Привет У меня есть массив, который собирает производителя и страну, по какой-то причине, когда массив возвращается, порядок массива иногда изменяется.Linq Array Список изменений заказа
Вот запрос Linq:
var array = (from xx in _er.UserRoles
join xy in _er.Countries on xx.CountryId equals xy.Id
join xz in _er.Manufacturers on xx.ManufacturerId equals xz.Id
where xx.UserId == userId
select new List<string> { xz.Description, xy.Name }).ToArray();
Где: xz.Description является производителем xy.Name является страна
В моем массиве я ожидаю получить следующее:
[0] Count = 2
[0] Dove
[1] Uk
[1] Count = 2
[0] Dove
[1] France
[2] Count = 2
[0] Sure
[1] UK
...
Однако в некоторых случаях я получаю следующее:
[0] Count = 2
[0] Dove
[1] Uk
[1] Count = 2
[0] France
[1] Dove
[2] Count = 2
[0] UK
[1] Sure
...
Когда я запускаю запрос в db, чтобы проверить, что у каждого производителя есть страна, которую они делают, поскольку изначально я думал, что это возможно.
Может ли кто-нибудь сделать предложение о том, почему это может произойти?
Редактировать
Здесь запрос SQL и некоторые выборки данных:
select m.Description, c.Name from UserRoles ur
join Countries c on ur.CountryId = c.Id
join Manufacturers m on ur.ManufacturerId = m.Id
where ur.userid = 435
Пример данные:
Description Name
Lynx United Kingdom
Persil United Kingdom
Dove Brazil
Dove Canada
Dove Germany
Dove France
Dove United Kingdom
Dove Netherlands
Dove United States
Surf United Kingdom
Comfort United Kingdom
Sure United Kingdom
Bertolli United Kingdom
Bertolli United States
Редактировать 2
Вот немного Больше объяснение того, что я делаю это может объяснить больше о том, что мне нужно как конечный результат:
В мой контроллер я получаю массив положить в сессию:
код контроллера:
var userManuCountry = _userRoleRepository.GetCountryAndManufacturerForUser(u.Id);
Session["userManuCountry"] = userManuCountry;
Repository код:
/// <summary>
///
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public string[,] GetCountryAndManufacturerForUser(int userId)
{
var array = (from xx in _er.UserRoles
join xy in _er.Countries on xx.CountryId equals xy.Id
join xz in _er.Manufacturers on xx.ManufacturerId equals xz.Id
where xx.UserId == userId
select new List<string> { xz.Description, xy.Name }).ToArray();
return CreateRectangularArray(array);
}
static T[,] CreateRectangularArray<T>(IList<T>[] arrays)
{
// TODO: Validation and special-casing for arrays.Count == 0
int minorLength = arrays[0].Count();
T[,] ret = new T[arrays.Length, minorLength];
for (int i = 0; i < arrays.Length; i++)
{
var array = arrays[i];
if (array.Count != minorLength)
{
throw new ArgumentException
("All arrays must be the same length");
}
for (int j = 0; j < minorLength; j++)
{
ret[i, j] = array[j];
}
}
return ret;
}
Другой контроллер - я использую сессии в список стран для производителя:
/// <summary>
/// et the specific countries for user and manufacturer
/// </summary>
/// <returns></returns>
[AcceptVerbs(HttpVerbs.Get)]
// [ValidateAntiForgeryToken]
// [Authorize(Roles = "ReportingDashboardAccess")]
public ActionResult GetListOfCountriesForUserManufacturer(int userId, string manu)
{
manu = manu.Trim();
// get the specific countries for user and manufacturer
var countries = new List<string>();
//here we want to use the manu to get the countries from seesion rather than db - this is a multidimensional array
string[,] manuCountry = (string[,])Session["userManuCountry"];
var addCountry = false;
//loop through to find countries for each manufacturer
for (int row = 0; row < manuCountry.GetLength(0); row++)
{
for (int col = 0; col < manuCountry.GetLength(1); col++)
{
string result = manuCountry[row, col];
result.Trim();
if (addCountry == true && col == 1)
{
//addcountry has been set to true so add it
countries.Add(result);
addCountry = false;
}
else if (addCountry == true && col == 0)
{
addCountry = false;
}
if (result == manu)
{
//the next one that comes through is the country
addCountry = true;
}
}
}
countries.Sort();
ViewData["allCountries"] = new SelectList(countries);
return View("CountriesParam");
}
Большое спасибо!
Вы должны явно определить ваши результаты, в противном случае заказ будет передано к SQL. В зависимости от того, есть ли у вас первичные ключи в таблице, он может не всегда возвращать один и тот же порядок. – CodingIntrigue
Просьба предоставить DB schama и некоторые примеры данных. – Sunny
@RGraham должен добавить orderby xz. – anna