How to query EntityFramework using generic property type?

c# entity-framework-6

Question

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?

1
3
2/2/2017 6:11:12 AM

Accepted Answer

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));
}
2
2/2/2017 6:31:51 AM

Popular Answer

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);
}


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow