Question

I'm just getting to grips with Compiled Queries in Linq, and have come across some strange behaviour.

This query compiles fine:

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)
    );

But when I try and change the return type from object to a KeyValuePair like so:

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)
    );

I get the following error:

CS1662: Cannot convert lambda expression to delegate type 'System.Func<DataContext,string,System.Collections.Generic.KeyValuePair<string,int>>' because some of the return types in the block are not implicitly convertible to the delegate return type

How can I return a single KeyValuePair from a compiled query? Or am I going about this completely the wrong way?

Was it helpful?

Solution

The compiled query will return a set of values, so in order to get it working, try changing the return type to IEnumerable<KeyValuePair<string, int>> - you are returning a set of values, not just one single value. You might then want to change the function name for the compiled query to GetJourneysByUrl.

Then to get a single value from the result set (implied by the function name of GetJourneyByUrl) then you should add a function to return the first item returned by the compiled query.

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

You can also set this up as a Func, as shown on this msdn page related to compiled queries.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top