In my Data Repository I have a base class and derived class as below.
public abstract class RepositoryBase<T> : IRepository<T> where T : EntityBase
{
public async Task<T> FindOneAsync(Expression<Func<T, bool>> predicate)
{
List<T> list = await SearchForAsync(predicate);
return list.FirstOrDefault();
}
}
public class CommentUrlRepository : RepositoryBase<CommentUrl>, ICommentUrlRepository
{
public async Task<CommentUrlCommon> FindOneAsync(
Expression<Func<CommentUrlCommon, bool>> predicate
)
{
Expression<Func<CommentUrl, bool>> lambda = Cast(predicate);
CommentUrl commentUrl = await FindOneAsync(lambda);
return MappingManager.Map(commentUrl);
}
private Expression<Func<CommentUrl, bool>> Cast(
Expression<Func<CommentUrlCommon, bool>> predicate
)
{
Expression converted =
Expression.Convert(
predicate,
typeof(Expression<Func<CommentUrl, bool>>)
);
// throws exception
// No coercion operator is defined between types
return Expression.Lambda<Func<CommentUrl, bool>>(converted, predicate.Parameters);
}
}
When I hit "Cast" function I am getting following error:
No coercion operator is defined between types 'System.Func`2[CommentUrlCommon,System.Boolean]' and 'System.Linq.Expressions.Expression`1[System.Func`2[CommentUrl,System.Boolean]]'.
How can I cast this Expression value?
I think what you want cannot be done...
Check this question for more.
If you are lucky and your expression is simple, Marc Gravell's Convert method might work for you
And a simpler example that demonstrates your problem
using System;
using System.Linq.Expressions;
namespace Program
{
internal class Program
{
private static void Main(string[] args)
{
Expression<Func<CommentUrlCommon, bool>> predicate = f => f.Id == 1;
//As you know this doesn't work
//Expression converted = Expression.Convert(predicate, typeof(Expression<Func<CommentUrl, bool>>));
//this doesn't work either...
Expression converted2 = Expression.Convert(predicate, typeof(Expression<Func<CommentUrlCommon, bool>>));
Console.ReadLine();
}
}
public class CommentUrlCommon
{
public int Id { get; set; }
}
public class CommentUrl
{
public int Id { get; set; }
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With