gpt4 book ai didi

c# - IEnumerable 与 linq

转载 作者:太空狗 更新时间:2023-10-29 17:58:04 25 4
gpt4 key购买 nike

我正在尝试构建动态数据上下文,linq 不支持动态类型我在

上找到了这个解决方案

http://jrwren.wrenfam.com/blog/2010/03/04/linq-abuse-with-the-c-4-dynamic-type/

public static class ObjectExtensionMethod
{
public static IEnumerable<dynamic> Select(this object source, Func<dynamic, dynamic> map)
{
foreach (dynamic item in source as dynamic)
{
yield return map(item);
}
}

public static IEnumerable<dynamic> Where(this object source, Func<dynamic, dynamic> predicate)
{
foreach (dynamic item in source as dynamic)
{
if (predicate(item))
yield return item;
}
}
}

此解决方案的问题是在应用 where 语句后从数据库获取所有数据。在从动态类型的数据库中获取数据之前,有什么方法可以应用 where 语句

最佳答案

the problem with this solution is getting all data from database after that applying the where statement.

这里的问题不在于动态,而在于迭代源代码的方式。您正在使用 foreach ,并期望它被翻译成 SQL 或某种形式,但这是错误的假设。一旦迭代器被 GetEnumerator() 创建方法调用查询将被“具体化”,即使 source 的真实类型也是如此正在实现 IQueryable<T> , end 其他一切都将在内存中执行。

如果您希望将条件转换为 SQL,您需要 to implement IQueryableProvider .

或者,至少你可以尝试调用底层 IQueryableProvider .但我不确定它是否有效。

public static class ObjectExtensionMethod
{
public static IQueryable Select<T>(this IQueryable source, Expression<Func<dynamic, dynamic>> map)
{
var method = new Func<IQueryable<dynamic>, Expression<Func<dynamic, dynamic>>, IQueryable<dynamic>>(Queryable.Select).Method;

var call = Expression.Call(null, method, source.Expression, Expression.Quote(map));

return source.Provider.CreateQuery(call);
}

public static IQueryable Where(this IQueryable source, Expression<Func<dynamic, bool>> predicate)
{
var method = new Func<IQueryable<dynamic>, Expression<Func<dynamic, bool>>, IQueryable<dynamic>>(Queryable.Where).Method;

var call = Expression.Call(null, method, source.Expression, Expression.Quote(predicate));

return source.Provider.CreateQuery(call);
}
}

请注意 source 的类型参数已从 object 更改至 IQueryablemap 的类型和 predicate参数已更改为 Expression<Func<,>> .

关于c# - IEnumerable<dynamic> 与 linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30837755/

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