2

エンティティ フレームワークを使用してクエリを並べ替えることに興味がありますが、式による動的な順序を使用して並べ替えるのに問題があります。

関連する多数の値 (DatasetValues) で構成される 1 対多の関係を持つ親レコード (DatasetRecord) があり、値が特定のフィールドに一致する場合、値に格納されているデータに基づいて並べ替えできるようにしたいと考えています。

したがって、提供された FieldID と一致する DatasetValues の値で並べ替える必要があります

public IEnumerable<DatasetRecordDto> FetchData(ModuleSettingsDto settings)
{
    var query = _context.DatasetRecords.AsQueryable().Where(r => r.DatasetId == settings.DatasetId && r.IsDeleted == false);

    foreach (var filter in settings.Filters)
    {
        // this works fine, check we have current field and value matches
        query = query.Where(i => i.DatasetValues.Any(x => x.DatasetFieldId == filter.DatasetFieldId && x.Value == filter.Value));
    }

    foreach (var sort in settings.Sort)
    {
        switch (sort.SortDirection)
        {
            case "asc":
                // THIS IS WHERE I NEED THE DYNAMIC ORDER BY EXPRESSION, 
                // THIS SHOULD SORT BY DATETIME WHERE FIELD ID MATCHES
                query = query.OrderBy(i => i.DatasetValues.Any(x => x.ValueDateTime && x.DatasetFieldId == sort.DatasetFieldId));
                break;
        }

    }

    return ShapeResults(query);
}

そして、これが私のデータベーススキーマです:

CREATE TABLE [dbo].[DatasetRecords](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [DatasetId] [int] NOT NULL
)

CREATE TABLE [dbo].[DatasetFields](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Label] [varchar](50) NOT NULL,
    [DatasetId] [int] NULL,
    [DataType] [int] NOT NULL
)

CREATE TABLE [dbo].[DatasetValues](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [DatasetRecordId] [int] NOT NULL,
    [DatasetFieldId] [int] NOT NULL,
    [ValueString] [varchar](8000) NULL,
    [ValueInt] [int] NULL,
    [ValueDateTime] [datetime] NULL,
    [ValueDecimal] [decimal](18, 2) NULL,
    [ValueBit] [bit] NULL
)

さらに情報が必要な場合はお知らせください。どんな助けでも大歓迎です。

更新:式による動的な順序の作成に問題はありません。子テーブルの値に基づいて、親レコードの条件付き並べ替え順序を適用しようとしています

4

1 に答える 1

0

LinqPad などで Linq コードを実行してみましたか?データセットに対して Linq コードを実行し、生成された SQL を表示できます。その SQL を取得して手動で実行し、エラーの原因となっている無効な SQL ではないことを確認できます。

于 2013-07-12T14:38:21.687 に答える