Why does this CompiledQuery not give a performance improvement?

I am trying to speed up a commonly used request. Using the answer CompiledQueryseemed the answer. But when I tried to compile the version, there was no performance difference between the compiled and non-compiled versions.

Can someone tell me why using Queries.FindTradeByTradeTagCompiledis no faster than using Queries.FindTradeByTradeTag?

static class Queries
{
    // Pre-compiled query, as per http://msdn.microsoft.com/en-us/library/bb896297
    private static readonly Func<MyEntities, int, IQueryable<Trade>> mCompiledFindTradeQuery =
        CompiledQuery.Compile<MyEntities, int, IQueryable<Trade>>(
            (entities, tag) => from trade in entities.TradeSet
                               where trade.trade_tag == tag
                               select trade);

    public static Trade FindTradeByTradeTagCompiled(MyEntities entities, int tag)
    {
        IQueryable<Trade> tradeQuery = mCompiledFindTradeQuery(entities, tag);

        return tradeQuery.FirstOrDefault();
    }

    public static Trade FindTradeByTradeTag(MyEntities entities, int tag)
    {
        IQueryable<Trade> tradeQuery = from trade in entities.TradeSet
                                       where trade.trade_tag == tag
                                       select trade;

        return tradeQuery.FirstOrDefault();
    }
}
+3
source share
4 answers

orandov, ( ). , . FirstOrDefault() .

, AsEnumerable() . AsEnumerable(), , FirstOrDefault() ( Linq.Enumerable.FirstOrDefault, Linq.Queryable.FirstOrDefault).

: 45 4 . 11 .

public static Trade FindTradeByTradeTagCompiled(MyEntities entities, int tag)
{
    IQueryable<Trade> tradeQuery = mCompiledFindTradeQuery(entities, tag);

    return tradeQuery.AsEnumerable().FirstOrDefault();
}
+7

AsEnumerable ( ), :

// Pre-compiled query, as per http://msdn.microsoft.com/en-us/library/bb896297
private static readonly Func<MyEntities, int, IQueryable<Trade>> mCompiledFindTradeQuery =
    CompiledQuery.Compile<MyEntities, int, IQueryable<Trade>>(
        (entities, tag) => (from trade in entities.TradeSet
                           where trade.trade_tag == tag
                           select trade).Take(1));
+5

"" , CompiledQuery, . , CompiledQuery ( , a CompiledQuery , "" ). , , , , , .

trade_tag? .

+4

Instead of returning IQueryable, simply configure the compiled query to directly return a single Trade object. This is much cleaner code than previous solutions.

// Pre-compiled query, as per http://msdn.microsoft.com/en-us/library/bb896297
private static readonly Func<MyEntities, int, Trade> mCompiledFindTradeQuery =
    CompiledQuery.Compile<MyEntities, int, Trade>(
        (entities, tag) => (from trade in entities.TradeSet
                           where trade.trade_tag == tag
                           select trade).FirstOrDefault() );

public static Trade FindTradeByTradeTagCompiled(MyEntities entities, int tag)
{
    return mCompiledFindTradeQuery(entities, tag);
}

Another Example: Linq to SQL for Linq Compiled Performance

0
source

Source: https://habr.com/ru/post/1740846/


All Articles