다음을 시도하면 오류가 발생합니다. 프로젝션없이 조건에 서브 쿼리를 사용할 수 없습니다.사용자 정의 Linq 컴파일 타임에 속성 이름을 알 수없는 쿼리
누구나 IQueryable : repository.Query (클래스 수준에서 정의 됨)에 대한 속성 이름을 사용하여 추가 된 표현식을 어떻게 만들 수 있는지 알려 줄 수 있습니까?
private void CheckConstraints(T model, ModelStateDictionary modelState)
{
foreach (var property in typeof(T).GetProperties())
{
if (property.HasCustomAttribute<UniqueInDatabase>())
{
object value = property.GetValue(model, null);
var count =
repository.Query<T>().Where(x => x.GetType().GetProperty(property.Name) == value).Count();
if ((model.Id > -1 && count > 1) || (model.Id == -1 && count > 0))
modelState.AddModelError("Not unique", string.Format("{0} already exists in database", property.Name.CapitalizeSpace()));
}
}
}
확인 도움이되었으므로 원본 코드에서 오류를 발견하고 해결책을 찾았습니다. 이것이 NHibernate에 저장소를되었을 때 다음 코드는 잘 작동 :
private void CheckConstraints(T model, ModelStateDictionary modelState)
{
foreach (var property in typeof(T).GetProperties())
{
if (property.HasCustomAttribute<UniqueInDatabase>())
{
object value = property.GetValue(model, null);
var count = repository.GetSession().CreateCriteria<T>()
.Add(Expression.Eq(property.Name, value))
.Add(Expression.Not(Expression.Eq("Id", model.Id)))
.List().Count;
if (count > 0)
modelState.AddModelError("Not unique", string.Format("{0} already exists in database", property.Name.CapitalizeSpace()));
}
}
}
"value"에는 .GetProperty (string)이 PropertyInfo를 반환하는 동안 해당 속성에 저장된 값이 포함되어있을 가능성이 있습니다. 내가 본 것으로부터 where 절은 항상 빈 세트를 리턴합니다. – flq