【发布时间】:2009-11-25 23:31:39
【问题描述】:
当我尝试以下操作时,我得到一个错误:不能在没有投影的条件上使用子查询。
谁能告诉我如何将属性名称添加到 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()));
}
}
}
【问题讨论】:
-
不确定您的错误,但“值”可能包含存储在所述属性中的值,而 .GetProperty(string) 应该返回一个 PropertyInfo。据我所知,您的 where 子句将始终返回一个空集。