【问题标题】:SQL Linq: get single instance of nested DB classSQL Linq:获取嵌套 DB 类的单个实例
【发布时间】:2020-05-12 07:48:45
【问题描述】:

我有以下型号

public class A
{
    public int Id { get; set; }
    public List<B> BData { get; set; }
}

public class B
{
    public int Id { get; set; }
    public string Name { get; set; }

    // Big class with lots of data
}

我的 DbContext 看起来像:

public class EmpSrvDbContext : DbContext
{
    public DbSet<A> AData { get; set; }

    // ...
}

我有一个 getter 应该返回 B。目前我正在尝试这样做:

B Get(int nAId, string sBName)
{
    A foundA = m_dbCtx.AData
        .Where(obj => obj.Id == nAId)
        .Include(obj => obj.BData)
        .FirstOrDefault();
    return foundA.BData.FirstOrDefault(obj => obj.Name == sBName);
}

我认为这是低效的,因为对于找到的 A 类,我会加载其所有 B 对象,并且由于 B 是一个大类,因此这是重。

有没有办法只获取A对象的请求B对象,而不包括/加载所有B对象? p>

谢谢,Csaba

【问题讨论】:

    标签: c# sql entity-framework


    【解决方案1】:

    无需将A加载到内存中,直接找到B即可:

    B Get(int nAId, string sBName)
    {
        B foundB = (
            from a in m_dbCtx.AData
            where a.Id == nAId
            from b in a.BData
            where b.Name == sBName
            select b
        )
        .FirstOrDefault();
    
        return foundB;
    }
    

    或者

    B Get(int nAId, string sBName)
    {
        B foundB = m_dbCtx.AData
            .Where(a => a.Id == nAId)
            .SelectMany(a => a.BData)
            .Where(b => b.Name == sBName)
            .FirstOrDefault();
    
        return foundB;
    }
    

    【讨论】:

    • 感谢您的回答。你能用基于方法的 Linq 语法来写这个吗?我确实太了解这种语法了 :-) 特别是我不知道什么是“来自”等价物......
    • 哇,SelectMany 是关键!说得通。非常感谢! :-)
    猜你喜欢
    • 2017-11-07
    • 2023-03-19
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多