【问题标题】:Linq and their sub queriesLinq 及其子查询
【发布时间】:2014-01-15 22:56:13
【问题描述】:

我有一个方法可以根据 accountId 返回一些交易。

所以,在我的数据访问器中,我这样做:

var items = (from c in Context.transactions where c.accountid == accountId select c).ToList();

然后我调用我拥有的方法,将实体框架对象转换为我自己的自定义 DTO 对象,然后返回一个我通过我的服务、逻辑传递给我的 MVC 控制器的对象。

翻译器获取相邻数据。因此,我的自定义 DTO 可能有一个名为“AccountName string”和“AccountType string”的字段。

帐户名称在一个表中,该表是 Transaction 表的外键,然后 AccountType 是 Account 表的外键。

所以,我的翻译器看起来像:

var return = new TransactionDto {
    tranactionId = source.id,
    accountName = source.Account.Description,
    accountType = source.Account.AccountType.description
}

我似乎有速度问题,我想知道我对 Linq 的理解是否是罪魁祸首。我以为初始数据检索上的ToList() 是选择的结束。然后它将所有数据传递给var items .. 但也许我的翻译实际上正在为“帐户”表进行选择,然后为“AccountType”表进行另一个选择。我的意思是,最初的'来自c in Context..'。获取所有外键表?

【问题讨论】:

    标签: linq entity-framework


    【解决方案1】:

    这称为延迟加载。使用Include 急切地加载必要的导航属性对象:

    var items = Context.transactions
                       .Include("Account")
                       .Include("Account.AccountType")
                       .Where(x => x.accountId == accountId)
                       .ToList();
    

    【讨论】:

    • 谢谢 Marcin... 所以他们的方式我正在做是无能的吗?然后使用“包含”将在 sql 中创建连接,并返回一个不错的结果集并将更大(但更有效和更高效)的模型传递给我的翻译器 - 然后不会在 Translate 方法中执行任何 SQL 调用?
    • 没错。它将下载这一 SQL 查询中包含的所有属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多