Linq得到孩子的物品

时间:2011-01-10 21:26:23

标签: c# entity-framework

当我对EF模型进行lunq查询时,它是否不能很好地获得子实体?我有一个Transaction表,它有一个Payee链接和一个事务类型实体。此外,每个交易都有一个交易行列表......

但代码吼叫 - 所有子对象看起来都是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 个答案:

答案 0 :(得分:2)

需要在数据上下文中启用延迟加载。

Db.ContextOptions.LazyLoadingEnabled = true;

或者您需要明确告诉EF加载关联。即。

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

答案 1 :(得分:2)

您有两种选择。您可以通过以下方式启用延迟加载:

Db.ContextOptions.LazyLoadingEnabled = true;

或者,如果您将查询行更改为此(对于Include,确切的语法可能不正确):

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

然后它应该将父记录的子记录拉回到单个结果集中。但是,如果有大量数据,这会带来性能损失。