gpt4 book ai didi

c# - 将 Func<> 传递给 Select

转载 作者:行者123 更新时间:2023-11-30 21:02:18 25 4
gpt4 key购买 nike

我从这个开始:

query
.Take(20)
.Select(item => new
{
id = item.SomeField,
value = item.AnotherField
})
.AsEnumerable()
.ToDictionary(item => item.id, item => item.value);

现在,我想重用除 SomeFieldAnotherField 之外的所有内容。

public static Dictionary<int, string> ReusableMethod<T>(
this IQueryable<T> query,
Func<T, int> key,
Func<T, string> value)
{
return query
.Take(20)
.Select(item => new
{
id = key(item),
value = value(item)
})
.AsEnumerable()
.ToDictionary(item => item.id, item => item.value);
}

query.ReusableMethod(item => item.SomeField, item => item.AnotherField);

这行得通,但是数据库查询选择的数据比需要的多,所以我猜这意味着 ReusableMethod 正在使用 linq-to-objects。

是否可以只选择所需的数据来执行此操作?我要补充一点,Func<> 对我来说仍然有些神奇,所以我可能遗漏了一些明显的东西。

澄清以避免混淆:Take(20) 没问题,Select() 不行。

最佳答案

Expression 包装您的函数并删除 AsEnumerable 调用。

 public static Dictionary<int, string> ReusableMethod<T>(
this IQueryable<T> query,
Expression<Func<T, int>> key,
Expression<Func<T, string>> value)

另一种方法是只返回整行。在这种情况下不需要 Expression

return query
.Take(20)
.ToDictionary(key, value);

关于c# - 将 Func<> 传递给 Select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13586520/

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