gpt4 book ai didi

.net - 重构 LINQ IQueryable 表达式以删除查询的重复部分

转载 作者:行者123 更新时间:2023-12-02 20:53:36 26 4
gpt4 key购买 nike

我有一些具有冗余的 linq 查询,我想提取出一段代码。这些是 IQueryable 的连接表达式,重要的是我不会导致查询比没有重构的情况更早进行评估。

这是一个简化的查询:

var result = 
from T in db.Transactions
join O in db.Orders on T.OrderID equals O.OrderID
join OD in db.OrderDetails on O.OrderID equals OD.OrderID into OrderDetails
let FirstProductBought = OrderDetails.First().Select(OD => OD.Product.ProductName)
select new
{
TransactionID = T.TransactionID,
OrderID = O.OrderID,
FirstProductBought = FirstProductBought
};

我想要考虑的是逻辑“给定订单,购买的第一个产品是什么”。我在其他查询中使用相同的逻辑。如何将其分解为共享方法?

一般来说,对于代码重用和 IQueryables,我能够做的是接受 IQueryable 进入并生成 IQueryable/IOrderedQueryable 作为输出的代码。通过这些函数,我可以使用可重用代码构建 LINQ 表达式,这些代码仍然会推迟查询,直到查询完全构建完成。在这里,由于我只有一个 int (orderID),我不知道如何让它工作。

谢谢

最佳答案

很抱歉回答我自己的问题,但我找到了一个很好的解决方案。我认为,根据您想要执行的操作,有不同的方法可以在不评估 IQueryable 的情况下分解出不同的 LINQ 表达式。所以我希望人们分享替代解决方案。

我的解决方案是为分解的查询创建一个“ View ”。我将其称为 View 是因为它与 SQL View 有很多共同点(从 LINQ 客户端的角度来看)。但与 SQL View 不同的是,它无法建立索引或保留列。所以使用这个 View 会成为瓶颈,使用实际的 SQL View 会比较合适。

static public class MyDataContextExtension
{
// The view exposes OrderSummary objects
public class OrderSummary
{
public OrderID { get; set; }
public string FirstProductListed { get; set; }
}

static public IQueryable<OrderSummary> OrderySummaryView(this MyDataContext db)
{
return (
from O in db.Orders
join OD in db.OrderDetails on O.OrderID equals OD.OrderID into OrderDetails
let AProductBought = OrderDetails.First().Select(OD => OD.Product.ProductName)
let TotalCost = OrderDetails.Aggregate(0
select new OrderSummary()
{
OrderID = OD.OrderID,
FirstProductListed = AProductBought.FirstOrDefault()
};
}
}

有了这个,我可以提取查询的重复部分,用以下内容替换原始查询:

var result = 
from T in db.Transactions
join OS in db.OrderSummaryView() on T.OrderID equals OS.OrderID
select new
{
TransactionID = T.TransactionID,
OrderID = T.OrderID,
FirstProductBought = OS.FirstProductListed
};

您可以想象添加其他列...我认为一件很酷的事情是,如果您添加额外的列但不在最终选择中使用它们,LINQ 实际上不会从数据库中查询这些内容。

关于.net - 重构 LINQ IQueryable 表达式以删除查询的重复部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/769351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com