3

Linqでコンパイルされたクエリを理解し始めたところですが、奇妙な動作に出くわしました。

このクエリは正常にコンパイルされます。

public static Func<DataContext, string, object> GetJourneyByUrl =
    CompiledQuery.Compile<DataContext, string, object>((DataContext dc, string urlSlug) =>
        from j in dc.Journeys
        where !j.Deleted
        where j.URLSlug.Equals(urlSlug)
        select new KeyValuePair<string, int>(j.URLSlug, j.JourneyId)
    );

しかし、リターンタイプをオブジェクトからKeyValuePairに次のように変更しようとすると、次のようになります。

public static Func<DataContext, string, KeyValuePair<string, int>> GetJourneyByUrl =
    CompiledQuery.Compile<DataContext, string, KeyValuePair<string, int>>((DataContext dc, string urlSlug) =>
        from j in dc.Journeys
        where !j.Deleted
        where j.URLSlug.Equals(urlSlug)
        select new KeyValuePair<string, int>(j.URLSlug, j.JourneyId)
    );

次のエラーが発生します。

CS1662:ラムダ式をデリゲート型'System.Func <DataContext、string、System.Collections.Generic.KeyValuePair <string、int >>'に変換できません。これは、ブロック内の一部の戻り型がデリゲート型に暗黙的に変換できないためです。

KeyValuePairコンパイルされたクエリからシングルを返すにはどうすればよいですか?それとも私はこれを完全に間違った方法で行っていますか?

4

1 に答える 1

6

コンパイルされたクエリは値のセットを返すので、それを機能させるには、戻り値のタイプを次のように変更してみてくださいIEnumerable<KeyValuePair<string, int>>。単一の値だけでなく、値のセットを返します。次に、コンパイルされたクエリの関数名をに変更することをお勧めしますGetJourneysByUrl

次に、結果セット(の関数名で示されるGetJourneyByUrl)から単一の値を取得するには、コンパイルされたクエリによって返される最初の項目を返す関数を追加する必要があります。

public static KeyValuePair<string, int> GetJourneyByUrl(DataContext dc, string urlSlug) {
  return GetJourneysByUrl(dc, urlSlug).First();
}

Funcコンパイルされたクエリに関連するこのmsdnページに示されているように、これをとして設定することもできます。

于 2013-02-20T11:39:26.980 に答える