Поскольку это LINQ to SQL, вам нужно предоставить что-то, что он сможет понять и проанализировать в SQL.В настоящий момент он увидит кучу сумасшедших размышлений и начнет плакать.
Вы можете изменить форму вызова вашего метода на
public Exists(Expression<Func<T, bool>> filter)
{
return Context.GetTable<T>.Any(filter);
}
// Usage
string valueToCheck = "Boo!";
bool exists = Exists(t => t.Bar == valueToCheck);
if (exists)
{
return "BAD USER - PICK SOMETHING UNIQUE";
}
, и это будет работать отлично.
Если вы хотите сохранить сигнатуру вашего метода, вы должны разбираться с деревьями выражений.По сути, вы хотите создать следующее выражение, чтобы LINQ to SQL мог идти: «о да, это условие where в столбце, которое соответствует свойству 'Bar'"
t => t.Bar == valueToCheck
Для воссоздания вам потребуется выполнитьследующее
private static Expression<Func<T, bool>> GetPredicate(string property, string value)
{
// First you need a parameter of the correct type
ParameterExpression parameter = Expression.Parameter(typeof (T), "t");
// Then use that parameter to access the appropriate property
MemberExpression propertyToAccess = Expression.Property(parameter, typeof (T), property);
// Introduce the constant value to check
ConstantExpression valueToCompare = Expression.Constant(value);
// Make sure they're equal
Expression comparison = Expression.Equal(propertyToAccess, valueToCompare);
// and create the expression based on the method body and the parameter...
return (Expression<Func<T, bool>>)Expression.Lambda(comparison, parameter);
}
public IsPropertyUnique(T entity, string property, string value)
{
return !Context.GetTable<T>.Any(GetPredicate(property, value));
}
Также использование Any вместо Where может быть немного более производительным, поскольку ему не нужно загружать соответствующие записи из БД (вместо этого он просто выполняет IF EXISTS).