【问题标题】:Including objects from join in query result在查询结果中包含来自联接的对象
【发布时间】:2014-08-12 01:20:50
【问题描述】:

想象一个简单的实体框架查询,其中包含从数据库生成的上下文,例如:

var q = from a in context.Accounts

        join c in context.Contracts
        on a.Id equals c.AccountId

        select new CustomAccount {
            Id = a.Id,
            Name = a.Name,
            ...
            Contracts = //How do I easily populate the related contracts?
        };

查询查找帐户并加入合同。该关系未在数据库中强制执行(我无法更改架构),因此我无法使用导航属性。有没有一种简单的方法可以填充相关对象?

【问题讨论】:

    标签: c# entity-framework join


    【解决方案1】:

    只需使用group by 子句。像这样的东西(未经测试):

    var q = from a in context.Accounts
            join c in context.Contracts on a.Id equals c.AccountId
            group a by new { a.Id, a.Name, a.Etc } into g
            select new CustomAccount
            {
                Id = g.Key.Id,
                Name = g.Key.Name,
                Etc = g.Key.Etc,
                Contracts = g.SelectMany(x => x.Contracts)
            };
    

    【讨论】:

    • 我很欣赏这个答案,虽然我没有测试过,但分组和投影的所有列的列表有点难看(我会有很多列)。
    【解决方案2】:

    我不确定我是否理解正确,但您可以执行返回匿名类型对象的查询

    编辑:您可以创建一个自定义类来保存结果的数据成员并在 linq 结果中返回。

    EDIT:在帐户名称上使用 group by(例如)

        var q = from a in context.Accounts
                join c in context.Contracts
                on a.Id equals c.AccountId
                group a by new { a.Name } into g
                select new AccountContracts
                {
                   AccountName = g.Key.Id,    // Account name
                   Contracts = g.SelectMany(x => x.Contracts)
                };
    

    【讨论】:

    • 这是真的,但这不是我想要做的。我不能让我的方法返回匿名 List
    • 这是一对多的关系。该属性是“合同”,暗示List
    • 感谢您的努力,但这仍然无法满足我的需求。我需要的不仅仅是帐户中的一个值,而且使用一长串属性进行分组(这是@shuniar 建议的)似乎很笨拙。
    • 我认为您需要更具体地说明您的问题,您的期望输出是什么...
    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多