Linq получает детские вещи - PullRequest
0 голосов
/ 11 января 2011

Когда я делаю ланк-запрос на модели EF, разве мы не получаем дочерние объекты хорошо?У меня есть таблица транзакций, в которой есть ссылка на получателя, и сущность типа транзакции.Кроме того, у каждой транзакции есть список строк транзакции ...

Но код ниже - все дочерние объекты видны как NULL, но данные в реальной сущности (Date) выглядят нормально.Но в строке: t.account.account_id;.... «account» имеет значение NULL.

 public static List<AccountTransactionDto> GetTransaction()
    {
        var trans = (from t in Db.account_transaction
                     select t).ToList();
        List<AccountTransactionDto> al = new List<AccountTransactionDto>();

        foreach(var t in trans)
        {
            AccountTransactionDto a = new AccountTransactionDto();
            a.AccountId = t.account.account_id;
            a.AccountTransactionId  = t.account_transaction_id;
            a.PayeeId = t.payee.payee_id;
            a.TransactionDate = t.transaction_date;
            a.TransactionTypeId = t.z_transaction_type.transaction_type_id;

            foreach(var tl in t.account_transaction_line)
            {
                AccountTransactionLineDto l = new AccountTransactionLineDto();
                l.AccountTransactionLineId = tl.account_transaction_line_id;
                l.Amount = tl.amount;
                l.BudgetId = tl.budget.budget_id;
                l.CostCenterId = tl.cost_centre.cost_centre_id;
                l.SubCategoryId = tl.sub_category.sub_category_id;
                a.AccountTransactionLine.Add(l);
            }

            al.Add(a);
        }
        return al;
    }

Ответы [ 2 ]

2 голосов
/ 11 января 2011

У вас есть два варианта.Вы можете включить отложенную загрузку через:

Db.ContextOptions.LazyLoadingEnabled = true;

Или, если вы измените строку запроса на это (точный синтаксис может быть неправильным для включения):

var trans = (from t in Db.account_transaction
             select t).Include("account_transaction.account_transaction_line");

Тогда он должен вытянутьназад дочерние записи с родительской записью в одном наборе результатов.Но это приводит к снижению производительности при большом количестве данных.

2 голосов
/ 11 января 2011

Ленивая загрузка должна быть включена в контексте данных.

Db.ContextOptions.LazyLoadingEnabled = true;

или вам нужно явно указать EF для загрузки ассоциации. т.е.

var trans = (from t in Db.account_transaction.Include('account').Include('payee') select t).ToList();

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