9

エンティティ データ モデルの一部ではないカスタム型へのクエリ結果の射影を使用しています。

public sealed class AlgoVersionCacheItem : NotificationObject
{
    public int OrderId { get; set; }
    public string OrderTitle { get; set; }
    public int? CurrentVersion { get; set; }
    public int CachedVersion { get; set; }
    public IEnumerable<int> AvailableVersions { get; set; }
}

AvailableVersions降順でソートしたい。したがって、私はAvailableVersions射影の並べ替えを追加しようとしました:

        return someQueryable
            .Select(version => new AlgoVersionCacheItem
            {
                OrderId = version.OrderId,
                OrderTitle = version.Order.Title,
                CurrentVersion = version.Order.CurrentAlgoVersionId,
                CachedVersion = version.Id,
                AvailableVersions = version
                    .Order
                    .AlgoVersions
                    .Where(v => (allowUncommittedVersions || v.Statuses.Any(s => s.AlgoVersionStatusListItemId == ModelConstants.AlgoVersionCommitted_StatusId)) && v.Id != version.Id)
                    .OrderByDescending(v => v.Id) // this line will cause exception
                    .Select(v => v.Id)
            })
            .Where(item => item.AvailableVersions.Any())
            .OrderByDescending(item => item.OrderId)
            .ToArray();

System.Data.EntityCommandCompilationException並べ替えを使用すると、クエリを実行すると with System.InvalidCastExceptionas inner 例外 がスローされます。

タイプ 'System.Data.Entity.Core.Query.InternalTrees.SortOp' のオブジェクトをタイプ 'System.Data.Entity.Core.Query.InternalTrees.ProjectOp' にキャストできません

.OrderByDescending(v => v.Id)すべてが正常に動作しなくても。
これは、Entity Framework でサポートされていない別の機能ですか、それとも見逃していますか?

PS私は、後でクライアント側でアイテムをソートできることを知っていますが、サーバー側でのソートについて疑問に思っています。

4

2 に答える 2

9

これは EF のバグです。EF5 と EF6 の両方でこれを再現できました。結果を作成する前にレコードをフィルタリングすることで、バグを回避できるはずです。

return someQueryable
    .Where(version => version.Order.AlgoVersions.Any(v => (allowUncommittedVersions || v.Statuses.Any(s => s.AlgoVersionStatusListItemId == ModelConstants.AlgoVersionCommitted_StatusId)) && v.Id != version.Id))
    .Select(version => new AlgoVersionCacheItem
        {
            OrderId = version.OrderId,
            OrderTitle = version.Order.Title,
                CurrentVersion = version.Order.CurrentAlgoVersionId,
                CachedVersion = version.Id,
                AvailableVersions = version
                    .Order
                    .AlgoVersions
                    .Where(v => (allowUncommittedVersions || v.Statuses.Any(s => s.AlgoVersionStatusListItemId == ModelConstants.AlgoVersionCommitted_StatusId)) && v.Id != version.Id)
                    .OrderByDescending(v => v.Id) // this line will cause exception
                    .Select(v => v.Id)
        })
    .OrderByDescending(item => item.OrderId)
    .ToArray();

また、関係の反対側 (つまり、注文) から行けば、このクエリを単純化できると思いますが、someQueryable作成方法によって異なる場合があります。

于 2013-11-05T00:39:59.463 に答える