我使用的是 vb.net 2013。 我尝试使用通过 NUGET 安装的工具。 EntityFramewrok.Utilities/链接:https://github.com/MikaelEliasson/EntityFramework.Utilities 这是一个开源的dll,整个代码可以下载。 从这个 DLL 中,我尝试使用“IncludeEFU”方法。 在上面的链接中,是我在 C# 项目中使用并有效的代码:
var result = db.Contacts
.IncludeEFU(db, x => x.PhoneNumbers
.Where(n => n.Number == "10134")
.OrderBy(p => p.ContactId)
.ThenByDescending(p => p.Number))
.ToList();
我尝试在我的 VB.net 应用程序上使用如下相同的代码:
Dim result = db.Contacts _
.IncludeEFU(db, Function(x) x.PhoneNumbers _
.Where(Function(n) n.Number = "10134")_
.OrderBy(Function(p) p.ContactId) _
.ThenByDescending(Function(p) p.Number)).ToList()
但是我得到一个错误:
An unhandled exception of type 'System.ArgumentException' occurred in EntityFramework.Utilities.dll
Additional information: Could not find a MemberExpression
逐个检查 dll 项目中的文件(可以在链接上下载),我看到我得到的错误消息来自这个子:
private static PropertyInfo SetCollectionModifiersAndGetChildProperty<T, TChild>(Expression<Func<T, IEnumerable<TChild>>> collectionSelector, List<MethodCallExpression> childCollectionModifiers)
where T : class
where TChild : class
{
var temp = collectionSelector.Body;
while (temp is MethodCallExpression)
{
var mce = temp as MethodCallExpression;
childCollectionModifiers.Add(mce);
temp = mce.Arguments[0];
}
childCollectionModifiers.Reverse(); //We parse from right to left so reverse it
if (!(temp is MemberExpression))
{
throw new ArgumentException("Could not find a MemberExpression", "collectionSelector");
}
var childProp = (temp as MemberExpression).Member as PropertyInfo;
return childProp;
}
看行:
throw new ArgumentException("Could not find a MemberExpression", "collectionSelector");
为什么这在 C# 项目上有效,而在 VB.net 项目上产生此错误? 我该如何解决这个问题? 谢谢!
已编辑:我尝试对该子项进行一些更改:
...
while (temp is MethodCallExpression)
{
var mce = temp as MethodCallExpression;
childCollectionModifiers.Add(mce);
temp = mce.Arguments[0];
}
while (temp is UnaryExpression)
{
var ue = temp as UnaryExpression;
temp = ue.Operand;
}
.....
在我重建dll文件后,现在错误信息消失了。 但是谁能确认这是一个正确的解决方案?
最佳答案
原始的 EntityFramework.Utilities DLL 可能是使用与您的 VB.NET 应用程序不同的 .NET“目标框架”构建的。
这可以解释为什么原始 DLL 无法工作,而您重建的 DLL(使用在 VS.NET 2013 中为您的项目定义的相同 .NET“目标框架”)却可以工作。
要检查 VS.NET 的“目标框架”,请在解决方案资源管理器中右键单击适用的项目,然后单击“属性”选项。 “应用程序”选项卡将显示一个“目标框架:”标签,其中包含可用的 .NET Framework 版本号的下拉输入。此下拉菜单的当前设置是用于在 VS.NET 2013 中进行构建的 .NET“目标框架”。
关于c# - 在 vb.net 项目上使用时,C# DLL 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28287088/