user845279
user845279

Reputation: 2804

How to query EntityFramework using generic property type?

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

Answers (2)

Slava Utesinov
Slava Utesinov

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

UserControl
UserControl

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

Related Questions