Where is EntitySet's “Results View”?

2019-06-04 18:39发布

问题:

When looking at a linked EntitySet<T> of a LINQ to SQL mapped entity, I see the following:

I'd like to see the following (achieved by using the .AsQueryable() extension method) so that I can click the little refresh icon and see the content:

Why can't I see the Results View on a regular plain EntitySet<T>?

Also, I've noticed that on this MSDN page it says:

In LINQ to SQL, the EntitySet<TEntity> class implements the IQueryable interface.

From what I can see, EntitySet<TEntity> doesn't inherit from either IQueryable nor IQueryable<T>. So what's up with that claim?

回答1:

You'll find the answer to this question

The results view only works for collections which meet the following conditions

  1. Implement IEnumerable or IEnumerable (VB.Net only works for IEnumerable)
  2. Do not implement IList, IList, ICollection or ICollection (C# restriction only)
  3. Do not have a DebuggerTypeProxy attribute
  4. System.Core.dll is loaded in the debugee process

In particular #2, EntitySet<T> implement's IList<T> therefore the debugger won't show a "Results View" option.

Using the AsQueryable extension method returns an object which only implements IQueryable and IEnumerable and therefore will show the "Results View" option.

You can read more about the #2 in the answer given in the other question.



回答2:

The terminology on the page you reference may be a bit off - since both EntitySet and IQueryable derive from IEnumerable, if EntitySet implemented IQueryable directly then implementing IEnumerable would be redundant.

What AsQueryable() does is convert the EntitySet to an EnumerableQuery (as shown in your second image) - and only after that conversion is done can the result view be seen.

Since EntitySet only derives from IEnumerable, this makes sense - as Enumerators don't return sets but references to individual members in a set, in a sequential order.