t.Customer, t => t.Order ) 而不是需要执行 db.Trans-6ren">
gpt4 book ai didi

c# - 如何创建包含多个实体(作为单独的参数传递)的 "Include"重载?

转载 作者:太空宇宙 更新时间:2023-11-03 12:36:38 25 4
gpt4 key购买 nike

我想为 Includes 写一个重载,它允许我做一些像 db.Transactions.Include(t => t.Customer, t => t.Order ) 而不是需要执行 db.Transactions.Include(t => t.Customer).Include(t => t.Order)。这是我的尝试:

    public static IQueryable<T> Include<T, TProperty>(this IQueryable<T> source, params Expression<Func<T, TProperty>>[] paths) {
foreach (var path in paths) {
source = QueryableExtensions.Include(source, path);
}

return source;
}

但是当我尝试使用它时,我收到一条错误消息“无法从用法中推断出该方法的类型参数。”我尝试做的事情可行吗?

最佳答案

您的方法不会像您期望的那样起作用。目前,您的方法会期望每个表达式都返回相同的类型,如果您为不同类型的类属性传递选择器,这将不起作用。

要正确处理各种类型,您需要通过删除类型参数来更改方法的签名 TProperty并使用 Expression<Func<T, object>>作为参数类型。

生成的签名应如下所示:

public static IQueryable<T> Include<T>(this IQueryable<T> source, params Expression<Func<T, object>>[] paths)

这将允许您将各种表达式的集合传递给该方法。

您可能会怀疑,这会导致问题,因为您将属性隐式转换为 object ,但这不会成为问题。如果您检查 QueryableExtensions.Include 的源代码(并深入到 DbHelpers.TryParsePath ),您会看到在表达式转换为 string 之前删除了转换.

关于c# - 如何创建包含多个实体(作为单独的参数传递)的 "Include"重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40699565/

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