0

LINQ の Union メソッドを使用して、2 つ以上のコレクションを結合しています。その後、コレクションに共通のフィールドで OrderBy を呼び出して、組み合わせたコレクションに並べ替えを適用しようとしています。ソートを適用する方法は次のとおりです。

combinedCollection.OrderBy(row => row["common_field"]);

結合コレクションは次のように定義されます。

Enumerable<DataRow> combinedCollection;

組み合わせたコレクション全体に並べ替えを適用する必要があります。何らかの理由で、それは起こっていません。代わりに、結合されたコレクション内の各「コレクション」ブロック内で、他のフィールドに個別にソートが適用されていることがわかります

そして、なぜ考えますか??

最初の編集

foreach (....)
{
    if (combinedCollection != null)
    {
        combinedCollection = combinedCollection.Union(aCollection);
    }
    else
    {
        combinedCollection = aCollection;
    }

}

2 回目の編集

    _Cmd.CommandText = "SELECT     Person.Contact.FirstName, Person.Contact.LastName, Person.Address.City, DATEDIFF(YY, HumanResources.Employee.BirthDate, GETDATE()) AS Age"
    + " FROM         HumanResources.EmployeeAddress INNER JOIN"
    + " HumanResources.Employee ON HumanResources.EmployeeAddress.EmployeeID = HumanResources.Employee.EmployeeID INNER JOIN"
    + " Person.Address ON HumanResources.EmployeeAddress.AddressID = Person.Address.AddressID INNER JOIN"
    + " Person.Contact ON HumanResources.Employee.ContactID = Person.Contact.ContactID AND HumanResources.Employee.ContactID = Person.Contact.ContactID AND "
    + " HumanResources.Employee.ContactID = Person.Contact.ContactID AND HumanResources.Employee.ContactID = Person.Contact.ContactID";

    DataTable employeeTable = new DataTable();
    _Adpt.Fill(employeeTable);
    DataRow[] allRows = null;

    allRows = employeeTable.Select("");

    IEnumerable<DataRow> filteredEmployeeRows;

    filteredEmployeeRows = from row in allRows select row;

    // Declare a variable to hold the city-filtered rows and set it to null for now
    IEnumerable<DataRow> cityFilteredEmployeeRows = null;


    //Copy filtered rows into a data table
    DataTable filteredEmployeeTable = filteredEmployeeRows.CopyToDataTable<DataRow>();

    foreach (DataRowView city in CityListBox.SelectedItems)
    {
        // create an exact copy of the data table
        DataTable filteredEmployeeCopyTable = filteredEmployeeTable.Copy();

        // Enumerate it
        IEnumerable<DataRow> filteredEmployeeRowsInSingleCity = filteredEmployeeCopyTable.AsEnumerable();

        // Apply the city filter
        filteredEmployeeRowsInSingleCity = _ApplyCityFilter(filteredEmployeeRowsInSingleCity, city["City"].ToString());

        if (cityFilteredEmployeeRows != null)
        {
            // Combine the filtered rows for this city with the overall collection of rows
            cityFilteredEmployeeRows = cityFilteredEmployeeRows.Union(filteredEmployeeRowsInSingleCity);
        }
        else
        {
            cityFilteredEmployeeRows = filteredEmployeeRowsInSingleCity;
        }

    }

    //apply ordering
    cityFilteredEmployeeRows.OrderBy(row => row["Age"]);
    //cityFilteredEmployeeRows.OrderByDescending(row => row["Age"]);

    EmployeeGridView.DataSource = cityFilteredEmployeeRows.CopyToDataTable<DataRow>();

.......

private IEnumerable<DataRow> _ApplyCityFilter(IEnumerable<DataRow> filteredEmployeeRows, string city)
{
    IEnumerable<DataRow> temp = filteredEmployeeRows;

    filteredEmployeeRows = from row in temp
                           where row["City"].ToString() == city
                           select row;
    return filteredEmployeeRows;
}
4

1 に答える 1

1

LINQ の遅延評価に問題があると思います。どの部分が問題を引き起こしているかを調査する必要があります。

遅延関数を使用するforeach(var item...)ことはすでに私を悩ませています(後で実行すると、それらはすべて最後に反復されたアイテムを参照するためです)が、あなたの場合、これが問題であるようには見えません。

DataRow[]それを確認するには、の代わりにa を使用して、すべての LINQ 関数の後にIEnumerable<DataRow>呼び出すことができる問題です。.ToArray()

編集:あなたのコードが正しいかどうかはわかりませんが、次のものを使用することはできません:

  var cities = CityListBox.SelectedItems.Cast<DataRowView>()
      .Select(city => city["City"].ToString())
      .ToArray();

  var rows = allRows
      .Where(r => cities.Contains((string)r["City"]))
      .OrderBy(r => (int?)r["Age"])
      .ToArray(); // if you want to evaluate directly, not mandatory
于 2013-02-08T15:04:27.330 に答える