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:无法将 lambda 表达式转换为委托类型 '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 回答