Объявить и инициализировать переменную для присвоения списка анонимных типов - PullRequest
3 голосов
/ 29 мая 2020

Я пытаюсь объединить две таблицы:

var data = from request in context.Requests
                        join account in context.AutolineAccts
                            on request.PkRequest.ToString() equals account.AccountCode
                        select new 
                        {
                            ID = request.PkRequest.ToString(),
                            Location = request.FkLocation,
                            RequestDate = request.RequestDate.Value,
                            Requestor = request.FkRequestor,
                            DebitorNr = request.FkDebitor.ToString(),
                            NewDebit = request.Debit.ToString(),
                            ApprovalStatus = request.ApprovalStatus.ToString(),
                            RecommendationStatus = request.RecommendationStatus.ToString(),
                            DebitorName = account.CustomerSname,
                            Limit = account.CreditLimit
                        };

Теперь я хочу отфильтровать набор результатов в зависимости от статуса пользователя:

// Accounting user
if (ActiveDirectoryHelper.CheckIfUserIsInADGroup(userLogin, AdGroups.ACCOUNTING) )

    req = data.Where(x => x.RecommendationStatus == null).ToList();

// After sales manager
else if (ActiveDirectoryHelper.CheckIfUserIsInADGroup(userLogin, AdGroups.SAV_LEADERS))
    req = data.OrderByDescending(x => x.ID).ToList();

// Everybody else
else 
    req = data.OrderByDescending(x => x.PkRequest).ToList();

И вот где я застрял. Когда у меня нет соединения и я получаю только тип «Запрос», я могу просто объявить список запросов

List<Requests> req;

Но с этой комбинацией запросов и AutolineAccts мне пришлось бы объявить и инициализировать список «элементов» (req) для присвоения набора результатов в сегментах if-else. Но я не знаю, как должна выглядеть эта анонимная переменная.

Позже мне нужно сопоставить набор результатов со списком моих моделей IndexView:

foreach (var item in req)
                viewModel.CLModels.Add(new IndexViewModel
                {
                    ID = item .PkRequest.ToString(),
                    Location = item .FkLocation,
                    RequestDate = item .RequestDate.Value,
                    Requestor = item .FkRequestor,
                    DebitorNr = item .FkDebitor.ToString(),
                    NewDebit = item .Debit.ToString(),
                    ApprovalStatus = item .ApprovalStatus.ToString(),
                    RecommendationStatus = item .RecommendationStatus.ToString(),
                    DebitorName = item.CustomerSname,
                    Limit = item.CreditLimit
                });

Есть идея решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Один из вариантов, которого следует избегать dynamic, - дать компилятору пример вашего анонимного типа:

var req = new[]
{
    new
    {
        ID = "",
        Location = "",
        RequestDate = DateTime.Now,
        Requestor = "",
        DebitorNr = "",
        NewDebit = "",
        ApprovalStatus = "",
        RecommendationStatus = "",
        DebitorName = "",
        Limit = 0
    }
}.ToList();

Очевидно, вам следует настроить значения, чтобы они соответствовали ожидаемому типу.

Это немного уродливо, но лично я бы предпочел это, чем использование динамического c набора текста.

Если вы хотите избежать фактического выделения массива и списка, вы можете использовать вывод типов довольно ужасным способом :

// Simple method that returns null, but enables type inference
public static List<T> ProvideNullList(T sample) => null;

// Call it when you want to declare your variable:
var sample = new
{
    ID = "",
    Location = "",
    RequestDate = DateTime.Now,
    Requestor = "",
    DebitorNr = "",
    NewDebit = "",
    ApprovalStatus = "",
    RecommendationStatus = "",
    DebitorName = "",
    Limit = 0
};
var req = GenericHelpers.ProvideNullList(sample);

Это все еще выделяет образец, но он как минимум на бит лучше, чем массив и список.

0 голосов
/ 29 мая 2020
IEnumerable<dynamic> result = from request in requests
                    join account in accounts
                        on request.id equals account.id
                        select new {id=request.id, name=account.name};

Сохраняет методы доступа, может быть дополнительно запрошен и может быть типом возврата метода.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...