使用带有实体框架的动态字段按子记录排序

Posted

技术标签:

【中文标题】使用带有实体框架的动态字段按子记录排序【英文标题】:Order by child records using dynamic field with entity framework 【发布时间】:2013-01-22 09:36:49 【问题描述】:

我有兴趣使用实体框架对查询进行排序,但在使用表达式的动态排序时遇到问题,

我有一个父记录 (DatasetRecord),它具有由多个关联值 (DatasetValues) 组成的一对多关系,如果它与某个字段匹配,我希望能够根据存储在值中的数据进行排序,

所以我需要按与提供的 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
)

如果您需要任何进一步的信息,请告诉我,非常感谢任何帮助,

更新:我在按表达式创建动态顺序时没有问题,我正在尝试根据子表中的值对父记录应用条件排序顺序

【问题讨论】:

你看到了吗:link 【参考方案1】:

您是否尝试过在 LinqPad 之类的东西上运行 Linq 代码,它可以让您针对数据集运行 Linq 代码并向您显示生成的 SQL。您可以获取该 SQL 并手动运行它,以确保它不是导致错误的无效 SQL。

【讨论】:

以上是关于使用带有实体框架的动态字段按子记录排序的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 和 Swift 如何按子值提取特定记录?

使用带有实体框架 6 的存储库模式更新记录

可以在实体框架中设置列排序

查找字段下拉记录的排序是什么?找到的可能答案

自定义 NSFetchreqeust - 按子 NSSet 属性排序父实体 [MagicalRecord+Coredata]

如何猫鼬列表() - 按子文档字段值过滤值