14

これを試してみると、うまくいきます:

var query = myContextObject.Users.Where(u=>u.Name == "John");
query.ToList();

ToListと他の多くの拡張メソッドを呼び出すことができます。

しかし、私がこれを試してみると:

public List ConvertQueryToList(IQueryable query)
{
    return query.ToList();
}

ToListアクセスできなくなります。これはToList拡張メソッドであるためだと思いますToListが、最初の例ではどのようにアタッチされていますか?ToList2番目のケースでアクセスすることは可能ですか?

4

4 に答える 4

20

あなたはそれを次のように書く必要があります:

public List<T> ConvertQueryToList<T>(IQueryable<T> query)
{
    return query.ToList();
}

これにより、IQueryable<T>は適切なを返します。これList<T>は、Enumerable.ToList()メソッドがIEnumerable<T>as入力を必要とするためです(これはIQueryable<T>IQueryable<T>継承IEnumerable<T>としても機能します)。

そうは言っても、このように使用する理由は実際にはありません。ToList()作成する必要がある場合は、いつでも直接呼び出すことができますList<T>。2番目のレイヤー内で抽象化すると、APIがさらに混乱します。

非ジェネリックIQueryableインターフェースを変換しようとしている場合は、次のようなことを行う必要があります。

public List<T> ConvertQueryToList<T>(IQueryable query)
{
    return query.Cast<T>.ToList();
}

これには、次のように呼び出す必要があります。

var results = ConvertQueryToList<SomeType>(queryable);

または、この非ジェネリック(これはお勧めしません)のままにしておきたい場合は、次を使用できます。

public ArrayList ConvertQueryToList(IQueryable query)
{
    ArrayList results = new ArrayList();
    results.AddRange(query.Cast<object>().ToList());
    return results;
}
于 2012-09-03T22:58:42.633 に答える
10

最初の例はを返しますがIQueryable<T>、2番目の例ではIQueryable(Generic Typeパラメーターなしで)使用しています。

ここここで、2つの完全に異なるインターフェースを確認できます。

于 2012-09-03T22:57:45.600 に答える
5

これを拡張する方法は次のとおりです。

public static class ListHelper
{
    public static IList ToList(this IQueryable query)
    {
        var genericToList = typeof(Enumerable).GetMethod("ToList")
            .MakeGenericMethod(new Type[] { query.ElementType });
        return (IList)genericToList.Invoke(null, new[] { query });
    }
}
于 2016-06-16T07:50:53.843 に答える
-1

IQueryable<>を使用している場合の一般的な拡張メソッドを次に示します。もちろん、タイプが間違っていてキャストが失敗する可能性があるため、絶対に安全というわけではありません。したがって、その方法を使用する場合は注意してください。

using System.Collections.Generic;
  
namespace System.Linq
{
    public static class Extensions
    {
        public static List<T> ToList<T>(this IQueryable queriable)
        {
            return ((IQueryable<T>)queriable).ToList();
        }
    }
}
于 2020-07-14T19:29:20.967 に答える