Linq .Where() 函数总是失败
Posted
技术标签:
【中文标题】Linq .Where() 函数总是失败【英文标题】:Linq .Where() function always fail 【发布时间】:2022-01-03 21:37:29 【问题描述】:我目前遇到了 Linq 的问题。我们在 C# 的 WPF 应用程序中使用 Telerik 控件。我有客户的“阵列”。数组的类型是来自 Telerik 的 QueryableEntityCoreCollectionView。这是gridview的来源。
我现在需要创建一个属性来返回这些客户端的子集。无论我在 Where 子句中设置什么条件,Where 都会失败并给我经典的 Object 没有设置为 Instance blahblahblah。 (网格能够得到一个 IEnumerable,所以我不必在最后转换回 QueryableEntityCoreCollectionView。
这是我正在尝试使用的一些代码:
public IEnumerable<Client> FilteredClients
get
IEnumerable<Client> res1 = clients.AsEnumerable<Client>();
IEnumerable<Client> res2 = res1.Where(T => 1 == 1);
return res2;
在上面的例子中, res1 包含 11 个元素。 res2 不起作用。它越过了它,我没有收到实际的异常,但是如果我在返回上放置一个断点,并检查 res1 和 res2,我可以看到 res1 没问题, res2 当我打开它的结果视图时,我得到了消息“对象引用未设置为对象的实例。”使用堆栈跟踪:
at System.Linq.Enumerable.WhereEnumerableIterator`1.ToArray()
at System.Linq.SystemCore_EnumerableDebugView`1.get_Items()
鉴于搜索条件“1==1”,我希望一切都能从中得出……但它失败了。即使进行真正的搜索,例如 T => T.City == T.City,它也会以同样的方式失败。无论我给 Where() 什么,它都失败了。如果我在这里简单地返回 res1,我的完整列表将作为 IEnumerable 传递回我的数据网格,并且一切正常。一旦我尝试过滤任何内容,它就会失败。
有什么想法吗?
编辑: 在 Hazrelle 发表评论后,我尝试调用 .ToList() ...但每次我尝试这样做时,都会收到 Null Exception。
clients.ToList<Client>(); // fails
clients.AsEnumerable<Client>().ToList<Client>(); // fails
我尝试的一切都失败了,我不知道为什么......
编辑2:仍然无法过滤或任何东西......但是我得到了以下代码行:
var query = clients.SourceCollection.ToEnumerable().First();
但是,查询不是客户端,而是 Telerik.Windows.Data.QueryableProxy ,并且仍然被视为包含 11 个项目的集合。它不仅仅是第一个客户。
【问题讨论】:
完整的堆栈跟踪应该显示错误来自哪个方法,来自 Telerik 或您自己的代码。如果它来自 Telerik,您可能应该将其报告为错误。不管怎样,我不认为我们可以在这里做任何事情。 您的FilteredClients
使用情况如何?当clients
已经为空时,您是否将其返回值保存在某个地方将使用它?
当您通过循环迭代进行过滤时会发生什么? QueryableEntityCoreCollectionView
似乎有点难以将集合的枚举传递给第二个变量。数据库中的数据是否已经在 clients
中?还是像IQuerable
那样每次访问它时都会获取它?如果是第二种情况,那么您可能需要致电AsQueryable( )
Telerik search for this type 没有结果
Where
可能在您使用 res2
之前不会执行。在此之后附加 .ToList()
应该可以解决您的问题。照顾deferred execution。
【参考方案1】:
似乎这个 QueryableEntityCoreCollectionView 对象有问题,或者我们不应该使用它,并且应该只由 Telerik 的东西在内部处理,但我通过从不创建这个对象解决了这个问题,我创建了一个很好的 ol'直接列出客户并将其提供给网格。 Linq 就像一个魅力那么......
由于某种原因,无论我对 QueryableEntityCoreCollectionView(of Client) 做了多少 AsEnumerable、ToList、AsWhatever,它总是充其量成为一个 QueryableEntityView(of Client),实际上从来没有成为一个简单的 List(of Client)。
奇怪。
这样做很可能我失去了更新数据库的能力,但是,在这一点上,这不是可更新的数据,至少不能从那个窗口更新。
【讨论】:
以上是关于Linq .Where() 函数总是失败的主要内容,如果未能解决你的问题,请参考以下文章
如何将重复的 where 子句表达式从 linq 拉到函数中?
linq查询中不同级别导航属性的相同where条件的通用表达式函数