當我嘗試以下時出現錯誤:無法在沒有投影的條件下使用子查詢。自定義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()));
}
}
}
不知道你的錯誤,但「價值」可能包含存儲在上述財產而.GetProperty(串)應該返回你的PropertyInfo值。從我看到的,你的where子句總是會返回一個空集。 – flq 2009-11-25 13:25:41