gpt4 book ai didi

linq - 为什么谓词在通过反射构建时不过滤

转载 作者:行者123 更新时间:2023-12-01 05:43:12 25 4
gpt4 key购买 nike

我正在构建一个基于 SearchObject 的相当大的过滤器,该过滤器有 50 多个可以搜索的字段。

与其为每一个单独构建我的 where 子句,我想我会使用一些轻微的手并尝试构建提供必要信息的自定义属性,然后使用反射来构建我的每个谓词语句(使用 LinqKit 顺便说一句)。问题是,代码在反射代码中找到了合适的值并成功地为该属性构建了一个谓词,但“where”似乎并没有真正生成,我的查询总是返回 0 条记录。

属性很简单:

[AttributeUsage(AttributeTargets.Property, AllowMultiple=true)]
public class FilterAttribute: Attribute
{
public FilterType FilterType { get; set; } //enum{ Object, Database}
public string FilterPath { get; set; }

//var predicate = PredicateBuilder.False<Metadata>();
}

这是我构建查询的方法:
public List<ETracker.Objects.Item> Search(Search SearchObject, int Page, int PageSize)
{
var predicate = PredicateBuilder.False<ETracker.Objects.Item>();

Type t = typeof(Search);
IEnumerable<PropertyInfo> pi = t.GetProperties();
string title = string.Empty;

foreach (var property in pi)
{
if (Attribute.IsDefined(property, typeof(FilterAttribute)))
{
var attrs = property.GetCustomAttributes(typeof(FilterAttribute),true);
var value = property.GetValue(SearchObject, null);
if (property.Name == "Title")
title = (string)value;
predicate.Or(a => GetPropertyVal(a, ((FilterAttribute)attrs[0]).FilterPath) == value);
}
}

var res = dataContext.GetAllItems().Take(1000)
.Where(a => SearchObject.Subcategories.Select(b => b.ID).ToArray().Contains(a.SubCategory.ID))
.Where(predicate);

return res.ToList();
}

SearchObject 非常简单:
public class Search
{
public List<Item> Items { get; set; }

[Filter(FilterType = FilterType.Object, FilterPath = "Title")]
public string Title { get; set; }
...
}

任何建议将不胜感激。我很可能走错了方向,如果有人有更好的选择(或至少一个有效的选择),我不会冒犯

最佳答案

你没有在任何地方分配你的谓词。将行更改为:

predicate = predicate.Or(a => GetPropertyVal(a, ((FilterAttribute)attrs[0]).FilterPath) == value);

关于linq - 为什么谓词在通过反射构建时不过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4019899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com