自定义Linq查询在编译时属性名称未知的位置

时间:2009-11-25 13:19:07

标签: c# 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()));

                }
            }

        }

1 个答案:

答案 0 :(得分:3)

您可能需要尝试Dynamic LINQ。动态LINQ代码作为VS2008 Code Samples

的一部分提供
 using System.Linq.Dynamic;

 ...

 var count = repository.Query<T>()
                       .Where( "@0 == @1", property.Name, value )
                       .Count();