【问题标题】:How to return a subquery in LINQ/EF如何在 LINQ/EF 中返回子查询
【发布时间】:2019-07-07 11:54:01
【问题描述】:

我有以下返回 SQL 子查询的方法。通过该方法的返回,我详细说明了主要查询。

但现在我需要使用 LINQ 查询来执行此操作。

我该怎么做?

Public void AvailableStock()
{
        string query = "Select prod.ID, prod.Name, ";
        query += AvailableStockQuery("prod.ID") + " as AvailableStock ";
        query += " From TAB_Products prod ";
}
Public string AvailableStockQuery(string ProductAlias = "prod.ID")
{
        string query = "((Select Sum(est.Quantity) " +
                       "  From ProductStock est " +
                       "  Where est.ProductID = " + ProductAlias +
                       " ) " +
                       " - (Select Sum(it.Quantity) " +
                          " From OrderItens it " +
                          " Where it.ProductID = " + ProductAlias + 
                          ")" +
                       ") ";

        return query;
}

【问题讨论】:

  • 您需要使用IQueryable 接口。在这种情况下,它会更难,因为您正在更改结果对象,而不是过滤部分。 stackoverflow.com/questions/5541234/…
  • 您能否编辑您的问题并向我们提供您的实体类以及它们之间的关系。您似乎有 TAB_Products、ProductStock、OrderItems,但它们之间有什么关系?你能描述一下你的查询要求吗? “给一个字符串ProductAlias,给我所有……来自……那个……

标签: sql-server entity-framework linq sql-to-linq-conversion


【解决方案1】:

但是,这里甚至不需要子查询。您可以将 ProductStock 和 OrderItens 表连接到 TAB_Products 表,并按 prod.ID 分组,然后根本不需要子查询。可能性能也更好。由于没有子查询,因此将其转换为 EF 更容易。

类似这样的:

SELECT prod.ID, FIRST(prod.Name), (SUM(est.Quantity) - Sum(it.Quantity)) AS AvailableStock 
From TAB_Products prod 
LEFT JOIN ProductStock est ON est.ProductID = prod.ID
LEFT JOIN OrderItens it ON it.ProductID = prod.ID
GROUP BY prod.ID

但是,如果您愿意,也可以进行子查询,下面是一个示例: https://docs.microsoft.com/en-us/dotnet/csharp/linq/perform-a-subquery-on-a-grouping-operation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多