Выражение типа 'System.Linq.IOrderedQueryable`1 [Models.Option]' нельзя использовать для типа возвращаемого значения 'System.Linq.IOrderedEnumerable`1 [Models.Option] - PullRequest
0 голосов
/ 29 апреля 2020

В следующем запросе я хочу отсортировать список дочерних элементов родительского элемента на основе свойства индекса, с которым я сталкиваюсь при следующей ошибке ... Как это исправить?

Expression of type 'System.Linq.IOrderedQueryable`1[Models.Option]' cannot be used for return type 'System.Linq.IOrderedEnumerable`1[Models.Option]'

Код:

[HttpGet("name={name}&includeSettings={includeSettings}&includeFields={includeFields}")]
public async System.Threading.Tasks.Task<ActionResult<Models.Form>> GetFormByName(string name, bool includeSettings = false, bool includeFields = false)
{
    var varForm = _context.Forms
        .Where(current => current.Name.Contains(name))
        .AsQueryable();

    if (includeSettings == true)
    {
        varForm = varForm
            .Include(current => current.FormUiSetting)
            .Include(current => current.FormResultSetting);
    }

    if (includeFields == true)
    {
        varForm = varForm
            .Include(current => current.FieldItems)
                .ThenInclude(field => field.Validations)
            .Include(current => current.FieldItems)
                .ThenInclude(field => field.Options.OrderBy(option => option.Index));
    }

    return await varForm.SingleOrDefaultAsync();
}

Моя модель похожа на это: у некоторых FieldItems есть список опций, а у некоторых его нет ...

public class Form
{
    public int Id { get; set; }
    public string Name { get; set; }
    --- some props ---
    public List<FieldItem> FieldItems { get; set; }
}

public class FieldItem
{
    public int Id { get; set; }
    public string FieldItemName { get; set; }
    public List<Validation> Validations { get; set; }
}

public class OptionableFieldItem : FieldItem
{
    public List<Options> Options { get; set; }
}

public class Validation
{
    public int Id { get; set; }
    --- some props ---
}

public class Options
{
    public int Id { get; set; }
    public string Index { get; set; }
}

1 Ответ

0 голосов
/ 30 апреля 2020

Изменить, как показано ниже:

public async Task<ActionResult<Form>> GetFormByName(string name, bool includeSettings = false, bool includeFields = false)
{
    var varForm = _context.Forms
        .Where(current => current.Name.Contains(name))
        .AsQueryable();

    if (includeSettings == true)
    {
        varForm = varForm
            .Include(current => current.FormUiSetting)
            .Include(current => current.FormResultSetting);
    }

    if (includeFields == true)
    {
        varForm = varForm
            .Include(current => current.FieldItems)
                .ThenInclude(field => field.Validations)
            .Include(current => current.FieldItems)
                .ThenInclude(field => field.Options);
        varForm.FirstOrDefaultAsync().Result.FieldItems.Options = varForm.FirstOrDefaultAsync()
                                                                            .Result.FieldItems.Options
                                                                            .OrderBy(o => o.Index).ToList();
    }

    return await varForm.SingleOrDefaultAsync();
}

Моя модель:

public class Form
{
    public int Id { get; set; }
    public string Name { get; set; }
    public FormUiSetting FormUiSetting { get; set; }
    public FormResultSetting FormResultSetting { get; set; }
    public FieldItem FieldItems { get; set; }
}
public class FormUiSetting
{
    public int Id { get; set; }
    public string FormUiName { get; set; }

}
public class FormResultSetting
{
    public int Id { get; set; }
    public string FormResultName { get; set; }
}
public class FieldItem
{
    public int Id { get; set; }
    public string FieldItemName { get; set; }
    public Validation Validations { get; set; }
    public List<Options> Options { get; set; }
}
public class Validation
{
    public int Id { get; set; }
    public string ValidateName { get; set; }
}
public class Options
{
    public int Id { get; set; }
    public string Index { get; set; }
}

ОБНОВЛЕНИЕ:

Для ваших требований, кажется, нет необходимости чтобы использовать FieldItem, просто используйте OptionableFieldItem.

Модель:

public class Form
{
    public int Id { get; set; }
    public string Name { get; set; }
public List<OptionableFieldItem> OptionableFieldItems { get; set; }
}

public class FieldItem
{
    public int Id { get; set; }
    public string FieldItemName { get; set; }
    public List<Validation> Validations { get; set; }
}

public class OptionableFieldItem : FieldItem
{
    public List<Options> Options { get; set; }
}

public class Validation
{
    public int Id { get; set; }
    public string ValidateName { get; set; }
}

public class Options
{
    public int Id { get; set; }
    public string Index { get; set; }
}

Действия:

if (includeFields == true)
{
    varForm = varForm.Include(current => current.OptionableFieldItems)
                    .ThenInclude(field => field.Validations)
                .Include(current => current.OptionableFieldItems)
                    .ThenInclude(field => field.Options);
    var data = varForm.FirstOrDefaultAsync().Result.OptionableFieldItems;
    foreach (var item in data)
    {
        item.Options = item.Options.OrderBy(o => o.Index).ToList();
    }
}
...