私はこれらの2つのエラーの間で、約50のクラスで共有されているエンティティコードを汎用化しようとしています。エンティティの一般的なキー
'System.Object'型の定数値を作成できません。このコンテキストでは、プリミティブ型または列挙型のみがサポートされています。演算子 '==' はタイプのオペランドに適用することはできません
'TKEY' と 'TKEY'
public abstract class BaseRepository<TEntity, TKey> : BaseRepository
where TEntity : KeyedBaseModel<TEntity, TKey>
{
public BaseRepository(MyProjectContext context)
{
Context = context;
}
protected MyProjectContext Context { get; set; }
public async Task<TEntity> SelectById(TKey id)
{
return await Context.Set<TEntity>().FirstOrDefaultAsync(s => s.Id == id);
}
}
問題がここに存在します:
s => s.Id == id
私が使用している場合== I Guidをプライマリキーとして使用するオブジェクトにエラーが発生し、使用するとエラーが発生します...
s => s.Id.Equals(id)
EntityがSystem.Object型の定数を作成できないというエラーが発生します。
動作しますが、私はに興味ラムダを使うことができるもの – StrangeWill
's.Id.Equals'を使用すると、結果の式は' s.Id'を「定数オブジェクト」( 'Expression.Constant')とEntity Frameworkにキャスト/変換するので、Entity Frameworkでは動作しませんそれで動作することはできません。一方、 's.Id == id'は、C#コンパイラがequals演算子と何をするべきか分からないのでコンパイルされません。オーバーロードされた' == 'を発見しようとするべきでしょうか?それは 'TKey'タイプのものであればボックスに入れて参照の比較をするべきでしょうか? –
ところで、私はあなたが 'Expression.Equals'、' Expression.Parameter'、 'Expression.Property'と' Expression.Constant'の組み合わせを使ってあなた自身の述語式*を書くならば、コンパイラをバイパスすることができると思います。何かこのような[リンク](http://stackoverflow.com/questions/15977908/creating-a-linq-expression-where-parameter-equals-object) –