Asp.net 核心 - 实体框架核心 - 将附加数据添加到视图对象,同时保持它是可查询的

Posted

技术标签:

【中文标题】Asp.net 核心 - 实体框架核心 - 将附加数据添加到视图对象,同时保持它是可查询的【英文标题】:Asp.net core - Entity Framework core - add additional data to a view object while keeping it a Queryable 【发布时间】:2021-10-31 07:59:53 【问题描述】:
    [EnableQuery]
    public ActionResult<IQueryable<OurView>> GetInteractionRecordings(int pageNumber)
    
        IQueryable<OurView> ourViews = _dbContext.OurView
            .Skip((pageNumber - 1) * 100)
            .Take(100)
            .AsQueryable();

        // One of the fields in OurView is a PhotoPath (string) that's not in the database.
        // We want to add that PhotoPath to every row without enumerating (function call for each row)
        // As we want to keep it a queryable

        return Ok(ourViews);
    

无论解决方案如何,最重要的是,我们要避免的情况如下:

假设数据库表中有 500,000 条记录,在执行“Take”或 PhotoPath 查找之前枚举表中的所有这些记录。

当我们使用 Odata 时,我们希望它是一个 Queryable。

【问题讨论】:

我没有收到任何问题。你知道Select - 你可以投射很多东西。 @SvyatoslavDanyliv - 但是 Select 不返回 IEnumerable 吗?据我了解,IQueryable 只是一个 SQL 语句,然后由 CLR 执行。如果我使用选择,查询不会在端点返回之前实际执行吗?我们使用 odata,所以想象一下我们一次抓取 100 条记录(就像我们现在一样),但他们应用了 LastName='justlooking' 的 odata 过滤器,这只是这 100 条中的 3 条。我希望打开照片查找三个,而不是 100 个。 你错了。 Select 是一个 IQueryable 扩展,它返回 IQuerybale。它是生成正确 LINQ 查询的基础。 天哪,伙计,我要告诉你的只是有人让我制作这个问题并将其发布到我的帐户下的人告诉我的。但是现在看一下智能感知(根据您的回复),有 10 个选项,有些确实返回 IQueryable,有些确实返回 IEnumerable。所以我知道我猜。但是我们想要进行实际的函数调用来获取特定的字符串。我想我会看看会发生什么。 我的意思是,似乎从 .Select 进行函数调用会导致创建行。身份证 【参考方案1】:

您可以通过Select

var ourViews = _dbContext.OurView
    .Skip((pageNumber - 1) * 100)
    .Take(100);

var photoPath = "SomePath";

var withAdditionalData = ourViews
    .Select(x => new 
    
        Id = x.Id,
        // other fields

        PhotoPath = photoPath
    );

【讨论】:

据我了解,部分问题在于他没有使用 Dynamic Linq。有了这个包,Select 是一个可行的解决方案。

以上是关于Asp.net 核心 - 实体框架核心 - 将附加数据添加到视图对象,同时保持它是可查询的的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架模型类中实现加密

使用实体框架核心生成和访问存储过程

带有 EF Core 更新实体的 ASP.Net 核心 Web Api 如何

asp.net 核心中的 HttpContext.RewritePath

将 ASP.NET 身份与核心域模型解耦 - 洋葱架构

如何关闭由 ASP.NET 核心框架完成的日志记录