2016-04-07 2 views
1

にエラーがスローさ、のはそれだけで2つのプロパティを持っているとしましょう:ジェネリッククラスは、私は<code>ILogging</code>を実装し、いくつかのエンティティ<code>Logging</code>を持ってLINQのツーエンティティ

public partial class Logging : ILogging 
{ 
    public int ID {get; set;} 
    public string Name {get; set;} 
} 
public interface ILogging { int ID {get; set;} } 

私はもともと静的含まれている静的クラスLogging.Qを持っていたExpression<Func<Logging,bool>>フィールドが、今私は、彼らが唯一のIDが必要な場合ILoggingのための式を書くことができるようにしたい:

public partial class Logging 
{ 
    public static Q<T> where T : ILogging 
    { 
     public static Expression<Func<T,bool>> IDOne = l => l.ID == 1; 
    } 
} 

私はこのような表現を呼び出すとき:

var log = ctx.Logging.Where(Logging.Q<Logging>.IDOne).FirstOrDefault(); 

私は、悪名高い "エンティティへのLINQのみサポートしています..." を取得:

'Entities.ILogging' を入力するタイプ 'Entities.Logging' をキャストすることができません。エンティティへのLINQは、EDMプリミティブまたは列挙型のキャストのみをサポートします。

しかし、なぜわからないのですか。私はクラスQにジェネリック型を定義していますので、ランタイムはLoggingで、ILoggingでは扱わないことがわかります。これを回避する方法はありますか?

+0

where T : class, ILogging結果ここに – TYY

+0

@TYYで編集しました –

+1

これがあなたの問題を解決するかどうかは分かりませんが、ある時点では制約にクラスを追加する必要があります。だから私はどこにTクラス、ILogging – TYY

答えて

2

C#コンパイラのバグや表現木の不具合に似ています。

制約がwhere T : ILogging又はwhere T : struct, ILoggingであれば、生成された式は{l => (Convert(l).ID == 1)}である、すなわち順番に悪名高いEF例外が発生キャスト(Convertを注意)を含みます。

しかし、class制約を置くことは、キャストを削除し、EFはちょうど幸せである:ロギングクラスの初期定義は、キーワードを部分的にマークされていないか、それだけで省略されているどのように来る{l => (l.ID == 1)}

+0

クラスの制約によって –

関連する問題