2017-03-03 5 views
0

私はおそらく間違った方法でクエリを起動しています。これはSql Serverバックエンドを使用したEF6です。私はSelect('sdfsdf', o => o.Category == 'Save Pewdiepie')でそれを呼び出すと、私はそれは、SQLでwhere句を置くことを期待DatabaseContext.Set <T> Sqlのwhere句を使用していません

public IEnumerable<T> Select(string sessionId, Func<T, bool> predicate = null) 
{ 
    using (var databaseContext = new DatabaseContext()) 
    { 
    var list = databaseContext.Set<T>().Where(predicate ?? (x => true)).AsQueryable<T>().ToList(); 
    list.ForEach(o => o.SessionId = sessionId); 
    return list; 
    } 
} 

、しかし、それはありませんwhere句で私にこれを与える::私が持っている

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[ClientId] AS [ClientId], 
    [Extent1].[Version] AS [Version], 
    [Extent1].[ReferenceNumber] AS [ReferenceNumber], 
    [Extent1].[RealExpirationDate] AS [RealExpirationDate], 
    [Extent1].[BusinessEffectiveDate] AS [BusinessEffectiveDate], 
    [Extent1].[BusinessExpirationDate] AS [BusinessExpirationDate], 
    [Extent1].[IsSuspended] AS [IsSuspended], 
    [Extent1].[RealEffectiveDate] AS [RealEffectiveDate], 
    [Extent1].[User] AS [User], 
    [Extent1].[Category] AS [Category] 
    FROM [dbo].[YouTube] AS [Extent1] 

これが起こっています大きなテーブルでは大きな問題になります。 where節を作成するにはどうすれば変更できますか?

+0

ほとんどEFの投稿 - http://stackoverflow.com/questions/42585640/entity-framework-lambda-predicate-stored- in-var-with-association)である。 'Func <...>'を 'Expression >' –

+0

@IvanStoevに変更します。署名を変更したくない場合は、どのように式に述語をラップできますか? – toddmo

+0

できません。 'Expression >'は 'Compile'メソッドを使って' Func <...> 'に変換できますが、逆もできません。これは、 'Expression'がより抽象的(式ツリー)なので、これをコード、文字列、またはあなたのケースではSQLに変換することができます。 'Func'は単なる実行可能なコードです。 –

答えて

0

私はそうExpressionを使用して、それを修正することができました:あなたの前に

public IEnumerable<T> Select(string sessionId, Expression<Func<T, bool>> predicate = null) 
{ 
    using (var databaseContext = new DatabaseContext()) 
    { 
    var list = databaseContext.Set<T>().Where(predicate ?? (x => true)).ToList(); 
    list.ForEach(o => o.SessionId = sessionId); 
    return list; 
    } 
} 
関連する問題