2013-02-07 57 views
2

我感興趣的使用實體框架排序查詢時遇到了問題由表達式中使用動態順序排序子記錄,爲了用充滿活力的領域與實體框架

我有一個父記錄(DatasetRecord)有一個以很多關係組成的關聯值(DatasetValues),我希望能夠根據存儲在數據中的數據進行排序,如果它匹配某個字段,那麼我需要按值排序數據集值與提供的FieldID匹配的地方

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 
) 

請讓我知道如果你需要任何進一步的信息,任何幫助是極大的讚賞,

更新:我沒有與創建一個動態的秩序問題通過表達式,我試圖根據子表中的值爲父記錄應用條件排序順序

+0

你見過這個:[link](http://stackoverflow.com/questions/307512/how-do-i-apply-orderby-on-an-iqueryable-using-a-string-column-name-中之基因) –

回答

0

您是否曾嘗試在LinqPad之類的東西上運行Linq代碼,它可以讓您針對數據集運行Linq代碼並顯示你生成的SQL。您可以採取該SQL並手動運行它,以確保它不是導致錯誤的某些無效SQL。