Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编译时属性名称未知的自定义Linq查询_C#_Linq - Fatal编程技术网

C# 编译时属性名称未知的自定义Linq查询

C# 编译时属性名称未知的自定义Linq查询,c#,linq,C#,Linq,当我尝试以下操作时,我得到一个错误:无法在没有投影的条件上使用子查询 有人能告诉我如何创建IQueryable:repository.Query(类型是在类级别定义的)中添加的属性名为的表达式吗 private void CheckConstraints(T模型、ModelStateDictionary modelState) { foreach(typeof(T).GetProperties()中的var属性) { if(property.HasCustomAttribute()) { 对象值

当我尝试以下操作时,我得到一个错误:无法在没有投影的条件上使用子查询

有人能告诉我如何创建IQueryable:repository.Query(类型是在类级别定义的)中添加的属性名为的表达式吗

private void CheckConstraints(T模型、ModelStateDictionary modelState)
{
foreach(typeof(T).GetProperties()中的var属性)
{
if(property.HasCustomAttribute())
{
对象值=property.GetValue(model,null);
var计数=
repository.Query().Where(x=>x.GetType().GetProperty(property.Name)==value.Count();
如果((model.Id>-1&&count>1)| |(model.Id==-1&&count>0))
modelState.AddModelError(“不唯一”,string.Format(“{0}已存在于数据库中”,property.Name.capitalispace());
}
}
}
好的,在一些帮助下,我找到了一个解决方案,并且在原始代码中发现了一个错误。由于这是一个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()));

                }
            }

        }
private void CheckConstraints(T模型、ModelStateDictionary modelState)
{
foreach(typeof(T).GetProperties()中的var属性)
{
if(property.HasCustomAttribute())
{
对象值=property.GetValue(model,null);
var count=repository.GetSession().CreateCriteria()
.Add(Expression.Eq(property.Name,value))
.Add(Expression.Not(Expression.Eq(“Id”,model.Id)))
.List().Count;
如果(计数>0)
modelState.AddModelError(“不唯一”,string.Format(“{0}已存在于数据库中”,property.Name.capitalispace());
}
}
}
您可能想尝试一下。动态LINQ代码是可用的

使用System.Linq.Dynamic;
...
var count=repository.Query()
.Where(“@0==@1”,property.Name,value)
.Count();

不确定您的错误,但“value”可能包含存储在所述属性中的值,而.GetProperty(string)应返回PropertyInfo。据我所见,where子句总是返回一个空集。好主意,我真的以为这会解决我的问题,但现在我抛出了一个null reference异常:[NullReferenceException:对象引用未设置为对象的实例。]NHibernate.criteria.SubqueryExpression..ctor(字符串op、字符串量词、DetachedCriteria dc)我不知道动态LINQ代码是否以任何形式与nHibernate一起工作,尽管我怀疑有些事情可能会起作用。我知道LINQ到nHibernate在此时还没有完全发挥作用。您可能希望将nHibernate信息添加到您的问题中并重新提问。也许有一种方法可以直接在nHibernate中这样做。可以,但是感谢您的回答,因为您的解决方案是正确的。@Richard您有没有发现空引用异常?
 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()));

                }
            }

        }
 using System.Linq.Dynamic;

 ...

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