gpt4 book ai didi

entity-framework-6 - 如何测试延迟加载的子集合是否已经加载

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

假设我的用户标签被延迟加载:

public class User
{
public int UserId { get; set; }

public virtual ICollection<Tag> Tags { get; set; }
}

如果我以这种方式获得用户,我知道标签未加载:

User myUser;
using (var context = new MyContext())
{
myUser = context.Users.Find(4);
}

如何在 using 子句之外测试 Tags 集合的存在?

if (myUser.Tags == null) // throws an ObjectDisposedException

我可以使用 try/catch,但必须有更好的方法。

最佳答案

我能想到的唯一方法是能够对类属性 getter 进行非虚拟调用(类似于在派生类中执行 base.Something 时)。由于没有办法用纯 C# 或反射来做到这一点,我最终得到了以下辅助方法,它利用 System.Reflection.Emit LCG(轻量级代码生成)发出 Call IL 指令而不是普通的 Callvirt:

using System;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;

public static class Utils
{
public static TValue GetClassValue<TSource, TValue>(this TSource source, Expression<Func<TSource, TValue>> selector)
where TSource : class

{
Func<TSource, TValue> getValue = null;
if (source.GetType() != typeof(TSource))
{
var propertyAccessor = selector.Body as MemberExpression;
if (propertyAccessor != null)
{
var propertyInfo = propertyAccessor.Member as PropertyInfo;
if (propertyInfo != null)
{
var getMethod = propertyInfo.GetGetMethod();
if (getMethod != null && getMethod.IsVirtual)
{
var dynamicMethod = new DynamicMethod("", typeof(TValue), new[] { typeof(TSource) }, typeof(Utils), true);
var il = dynamicMethod.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.EmitCall(OpCodes.Call, getMethod, null);
il.Emit(OpCodes.Ret);
getValue = (Func<TSource, TValue>)dynamicMethod.CreateDelegate(typeof(Func<TSource, TValue>));
}
}
}
}
if (getValue == null)
getValue = selector.Compile();
return getValue(source);
}
}

它可以像这样用于单个和集合类型的导航属性:

if (myUser.GetClassValue(x => x.Tags) == null)

关于entity-framework-6 - 如何测试延迟加载的子集合是否已经加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37968115/

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