Reputation: 2804
When I call DbSet.FirstOrDefault()
by passing a predicate that compares generic type TId
, I get the following exception:
unable to create a constant value of type 'system.object'. only primitive types or enumeration types are supported in this context.
Interface for type being queried:
interface IEntity<TId>
{
TId id { get; set; }
}
The exception is thrown here:
public virtual TEntity Get<TEntity, TId>(TId id) where TEntity : class, IEntity<TId>
{
return dbContext.Set<TEntity>().FirstOrDefault(e => e.Id.Equals(id));
}
The function will only work if TId
is constrained as struct
. How can I include string
as supported type? If it's not possible, is it possible to accomplish the task a different way?
Upvotes: 3
Views: 2123
Reputation: 13488
You can simply use Find
method:
public virtual TEntity Get<TEntity, TId>(TId id) where TEntity : class, IEntity<TId>
{
return dbContext.Set<TEntity>().Find(id);
}
Upvotes: 2
Reputation: 15159
This will work for strings too:
public virtual TEntity Get<TEntity, TId>(TId id)
where TEntity : class, IEntity<TId>
where TId: IEquatable<TId>
{
return dbContext.Set<TEntity>().FirstOrDefault(e => e.Id.Equals(id));
}
Upvotes: 2