C# IEnumerable.except错误
我有两个从数据库表中检索到的数据C# IEnumerable.except错误,c#,asp.net,C#,Asp.net,我有两个从数据库表中检索到的数据IEnumerable,分别称为FullSet和InScopeSubSet 第二个IEnumerable是第一个集合的子集(两个集合都有ChildID作为其唯一ID) 我想创建一个新的IEnumerable,它只包含x中不在y中出现的项 我已经尝试了以下内容,但无法编译。它说: “扩展方法不能动态调度。请考虑在不使用扩展方法语法的情况下强制转换动态参数或调用扩展方法”< /P> 要解决编译器错误,请使用其第二个建议: var OutScopeSubSet = En
IEnumerable
,分别称为FullSet
和InScopeSubSet
第二个IEnumerable
是第一个集合的子集(两个集合都有ChildID
作为其唯一ID)
我想创建一个新的IEnumerable
,它只包含x中不在y中出现的项
我已经尝试了以下内容,但无法编译。它说:
“扩展方法不能动态调度。请考虑在不使用扩展方法语法的情况下强制转换动态参数或调用扩展方法”< /P>
要解决编译器错误,请使用其第二个建议:
var OutScopeSubSet = Enumerable.Except(FullSet, InScopeSubSet);
可枚举集合运行正常,但返回整个第一个集合,而不带出任何项
如果是这种情况,您可能会在不相同的对象上进行引用比较。您可以通过实现一个定制的IEqualityComparer来实现这一点。电话变成了电话
var OutScopeSubSet = Enumerable.Except(FullSet, InScopeSubSet, new DynamicChildIdComparer());
DynamicChildIdComparer是:
class DynamicChildIdComparer : IEqualityComparer<object>
{
public bool Equals(object x, object y)
{
return ((dynamic)x).ChildID.Equals(((dynamic)y).ChildID);
}
public int GetHashCode(object obj)
{
return ((dynamic)obj).ChildID.GetHashCode();
}
}
类动态儿童比较器:IEqualityComparer
{
公共布尔等于(对象x、对象y)
{
返回((动态)x.ChildID.Equals((动态)y.ChildID);
}
public int GetHashCode(对象obj)
{
return((动态)obj.ChildID.GetHashCode();
}
}
要解决编译器错误,请使用第二个建议:
var OutScopeSubSet = Enumerable.Except(FullSet, InScopeSubSet);
可枚举集合运行正常,但返回整个第一个集合,而不带出任何项
如果是这种情况,您可能会在不相同的对象上进行引用比较。您可以通过实现一个定制的IEqualityComparer来实现这一点。电话变成了电话
var OutScopeSubSet = Enumerable.Except(FullSet, InScopeSubSet, new DynamicChildIdComparer());
DynamicChildIdComparer是:
class DynamicChildIdComparer : IEqualityComparer<object>
{
public bool Equals(object x, object y)
{
return ((dynamic)x).ChildID.Equals(((dynamic)y).ChildID);
}
public int GetHashCode(object obj)
{
return ((dynamic)obj).ChildID.GetHashCode();
}
}
类动态儿童比较器:IEqualityComparer
{
公共布尔等于(对象x、对象y)
{
返回((动态)x.ChildID.Equals((动态)y.ChildID);
}
public int GetHashCode(对象obj)
{
return((动态)obj.ChildID.GetHashCode();
}
}
您正在寻找“不在”SQL类型的操作吗
LINQ中的“不在”可以这样实现:
var filterData = new List { "ListA", "ListB" };
var data= context.table.Select( c => c.id ).Except( filterData );
您正在寻找“不在”SQL类型的操作吗
LINQ中的“不在”可以这样实现:
var filterData = new List { "ListA", "ListB" };
var data= context.table.Select( c => c.id ).Except( filterData );
什么是DB?DB.Query返回什么类型?它没有返回(键入的)IEnumerable,或者不会得到此错误。Database.Query。返回值的类型为:System.Collections.Generic.IEnumerable(对象的)SQL查询返回的行。请注意,要使
尖括号出现,必须将文本格式化为代码(正如我所做的那样)。我有点困惑,不过:我可以毫无问题地运行IEnumerable.Except(IEnumerable)
;你能在运行时检查这两个变量的实际类型并确保它们是你期望的吗?啊,nm,我看到它们是IEnumerable
。DB是什么?DB.Query返回什么类型?它没有返回(键入的)IEnumerable,或者不会得到此错误。Database.Query。返回值的类型为:System.Collections.Generic.IEnumerable(对象的)SQL查询返回的行。请注意,要使
尖括号出现,必须将文本格式化为代码(正如我所做的那样)。我有点困惑,不过:我可以毫无问题地运行IEnumerable.Except(IEnumerable)
;你能在运行时检查这两个变量的实际类型并确保它们是你所期望的吗?啊,nm,我看到它们是IEnumerable
。谢谢。可查询的一个返回一个错误:“System.Linq.Queryable.Except(System.Linq.IQueryable,System.Collections.Generic.IEnumerable)”的最佳重载方法匹配'有一些无效的参数。可枚举的一个运行正常,但返回整个第一个集合而不带任何项。如果查询返回的是IEnumerable
,则第一个将不起作用;问题似乎是您正在返回对象
,它无法确定其中两个“行”是否“相等”。@CharlotteCopper可查询版本不会运行,因为变量是IEnumerable,而不是IQueryable。当我发布答案时,我忽略了这一点,对不起;我已经去掉了这个坏例子。请参阅编辑后的答案,了解有关错误结果的信息。是的,它是从database.Query返回的IEnumerable。我如何比较它们?thanks@CharlotteCopper刷新你的页面;在你发表最后一条评论前一分钟,我编辑了这个问题。:-)谢谢。可查询方法返回错误:“System.Linq.Queryable.Exception(System.Linq.IQueryable,System.Collections.Generic.IEnumerable)”的最佳重载方法匹配具有一些无效参数。可枚举的一个运行正常,但返回整个第一个集合而不带任何项。如果查询返回的是IEnumerable
,则第一个将不起作用;问题似乎是您正在返回对象
,它无法确定其中两个“行”是否“相等”。@CharlotteCopper可查询版本不会运行,因为变量是IEnumerable,而不是IQueryable。当我发布答案时,我忽略了这一点,对不起;我已经去掉了这个坏例子。请参阅编辑后的答案,了解有关错误结果的信息。是的,它是从database.Query返回的IEnumerable。我如何比较它们?thanks@CharlotteCopper刷新你的页面;在你发表最后一条评论前一分钟,我编辑了这个问题。:-)