gpt4 book ai didi

nhibernate - 使用 NHibernate 流式传输大型结果集真的有效吗?

转载 作者:行者123 更新时间:2023-12-04 06:27:24 27 4
gpt4 key购买 nike

我正在使用 ayende 在这里提出的方法:

http://ayende.com/Blog/archive/2010/06/27/nhibernate-streaming-large-result-sets.aspx

在带有 NHibernate 3.0 的 SQL Server 2005 上。

我的测试(尝试流式传输包含 10,000,000 个项目的结果集)表明结果没有被流式传输(看起来整个结果集首先加载到内存中)。

我怎样才能让它发挥作用?我将接受任何允许在 NHibernate 中流式传输结果集的解决方案,它不必完全是 ayende 的解决方案。

最佳答案

您可以使用 NH 4.0.0.4000 使用以下扩展方法从 Linq 流式传输结果(如果您不喜欢反射 hack,请传入 ISessionImplementor):

public static EnumerableImpl Stream<T>(this IQueryable<T> source)
{
var provider = ((NhQueryable<T>) source).Provider as DefaultQueryProvider;
var sessionImpl = (ISessionImplementor)provider.GetType()
.GetProperty("Session", BindingFlags.NonPublic |
BindingFlags.Instance).GetValue(provider);
var expression = new NhLinqExpression(source.Expression, sessionImpl.Factory);
var query = sessionImpl.CreateQuery(expression);
query.SetParameters(expression.ParameterValuesByName);
provider.SetResultTransformerAndAdditionalCriteria(
query, expression, expression.ParameterValuesByName);
return (EnumerableImpl)((AbstractQueryImpl2)query).Enumerable();
}

private static void SetParameters(this IQuery query,
IDictionary<string, Tuple<object, IType>> parameters)
{
foreach (var parameterName in query.NamedParameters)
{
var param = parameters[parameterName];
if (param.Item1 == null)
{
if (typeof(IEnumerable).IsAssignableFrom(param.Item2.ReturnedClass) &&
param.Item2.ReturnedClass != typeof(string))
query.SetParameterList(parameterName, null, param.Item2);
else query.SetParameter(parameterName, null, param.Item2);
}
else
{
if (param.Item1 is IEnumerable && !(param.Item1 is string))
query.SetParameterList(parameterName, (IEnumerable)param.Item1);
else if (param.Item2 != null)
query.SetParameter(parameterName, param.Item1, param.Item2);
else query.SetParameter(parameterName, param.Item1);
}
}
}

您需要将其包装在 using 语句中以确保阅读器已关闭:
using (var results = session.Query<Fark>().Take(50).Where(x => x.Enabled).Stream())
{
results.ForEach(x => writer.WriteLine(x.ToCsv()));
}

关于nhibernate - 使用 NHibernate 流式传输大型结果集真的有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5873208/

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