【问题标题】:linq async call to map to one object 2 tables with a foreign keylinq 异步调用以映射到一个对象 2 个具有外键的表
【发布时间】:2019-03-06 21:52:24
【问题描述】:

我知道这个标题可能听起来很糟糕,但这是我能想到的最好的。 (也是我在堆栈上的第一个问题:P)

我已经对数据库进行了逆向工程,并且我有一些如下所示的类:

public class Orders
{
    public int Id { get; set; }
    public int LocationId { get; set; }
    ...
    public Locations Location { get; set; }
    public Users User { get; set; }
}
public class Locations 
{
    public int Id { get; set; }
    ...
}

我还有 2 个带有外键“LocationId”的 SQL 表“订单”和“位置”

如果我想像这样使用 LINQ 进行选择:

var ordersResult = await _context.Orders.Where(o => <some condition>).ToListAsync();

然后它将用所有属性填充我的对象,但 Location 对象属性将为空。这是有道理的,因为我没有加入或类似的事情。

我不知道如何编写 LINQ 语句,以便它只在一次异步调用中填充整个对象,而无需多次调用数据库。

我也试过这样做:

var ordersResult = await _context.Orders.Join(_context.Locations,
                orders => orders.LocationId,
                locations=> locations.Id,
                (orders, locations) => new { Orders = orders, Locations = locations })
            .Where(orders_users => <some condition>)
            .Select(o => o.Orders)
            .ToListAsync();

但这仍然给我的 Locations 属性一个空值。

提前感谢您的帮助!

【问题讨论】:

    标签: c# asp.net linq api web


    【解决方案1】:

    使用包含

    await _context.Orders.Include("Location").Where(o => <some condition>).ToListAsync();
    

    【讨论】:

    • 哇,这很简单。非常感谢!它现在可以工作(至少在调试时),但是 API 超时。当我尝试以相同的方法对数据库进行 2 次异步调用时,它会做同样的事情。你对此有什么想法吗?
    • 超时意味着数据库出现超时异常?还是你得到 0 个结果?如果您得到 0 个结果,请确保您在任何异步函数前面使用 await(不仅仅是 db ToListAsync())
    • 我正在使用 Postman,但我得到以下信息:“无法得到任何响应连接到 localhost:55520/api/Orders..... 时出错。”如果我删除包含它,它会完美运行。跨度>
    • 提琴手这样说:“[提琴手] ReadResponse() 失败:服务器没有为此请求返回完整的响应。服务器返回 1,079 字节。”这是一个 504 但我不知道如何解决它。
    • 这个 db 调用是直接在您的控制器中还是在管理器/repo 类中?
    猜你喜欢
    • 2016-08-15
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    相关资源
    最近更新 更多