Проверка HasProperty на IQueryable <object>- C # .NetCore 2.2 - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть метод, который добавляет динамический linq (System.Linq.Dynamic.Core) к IQueryable:

public static IQueryable<object> SearchBySecurityList(List<SecurityListFilter> caSecurityFilterList, IQueryable<object> qry)

public class SecurityListFilter
{
    public string FooOne{ get; set; }
    public string FooTwo { get; set; }
    public string FooThree { get; set; }
    public string FooFour { get; set; }
    public string FooFive { get; set; }
}

Метод создает строку where в конце метода, просто связывая строку where с qry:

return qry.Where(whereClause, paramList.ToArray());

Проблема в том, что некоторые объекты (переданные как "qry") не имеют некоторых свойств объекта SecurityListFilter. Итак, допустим, я передаю IQueryable qry в свой метод, а свойство FooFour не существует. Я получу сообщение о том, что свойство не существует.

У меня вопрос, как мне проверить свойство, чтобы увидеть, существует ли FooFour в IQueryable ?

Я пробовал это, но это всегда ложно:

if (qry.HasProperty("FooFour") != false)

1 Ответ

0 голосов
/ 09 ноября 2018

Я не уверен, что есть лучший ответ, но в настоящее время это работает для меня. В начале метода я делаю это:

PropertyInfo[] props = qry.GetType().GetProperties();

Затем, позже, когда мне нужно проверить, существует ли свойство:

if(!props.HasProperty("SomePropertyOne") || !props.HasProperty("SomePropertyTwo"))

РЕДАКТИРОВАТЬ 1: @StriplingWarrior - вот мой метод, который в настоящее время работает. Чувствительные имена были удалены и заменены на «Бла».

public static IQueryable<object> SearchBySecurityList(List<SecurityListFilter> caSecurityFilterList, IQueryable<object> qry, string companySearch, string fpSearch, string poSearch, string controlOwnerSearch, string carSearch)
    {
        string whereClause = "";
        int paramCount = -1;
        int loopCount = 1;
        PropertyInfo[] props = qry.GetType().GetProperties();
        List<string> paramList = new List<string>();
        List<string> finalList = new List<string>();

        foreach (var i in caSecurityFilterList)
        {
            if (loopCount > 1)
            {
                whereClause = whereClause + " || ";
            }

            string innerWhere = "(";
            if (!string.IsNullOrWhiteSpace(i.CompanyName))
            {
                if(!props.HasProperty("Company") || !props.HasProperty("CompanyName"))
                {
                    paramList.Add(i.CompanyName);
                    paramCount++;
                    innerWhere = innerWhere + $"{companySearch} == @{paramCount}";
                }
            }
            if (!string.IsNullOrWhiteSpace(i.BlahProcessName))
            {
                if (!props.HasProperty("BlahProcess") || !props.HasProperty("BlahProcessName"))
                {
                    paramList.Add(i.BlahProcessName);
                    paramCount++;
                    if (innerWhere.Length > 1) innerWhere = innerWhere + " and ";
                    innerWhere = innerWhere + $"{fpSearch} == @{paramCount}";
                }
            }
            if (!string.IsNullOrWhiteSpace(i.ProcessOwner))
            {
                if (!props.HasProperty("ProcessOwner"))
                {
                    paramList.Add(i.ProcessOwner);
                    paramCount++;
                    if (innerWhere.Length > 1) innerWhere = innerWhere + " and ";
                    innerWhere = innerWhere + $"{poSearch} == @{paramCount}";
                }
            }
            if (!string.IsNullOrWhiteSpace(i.ControlOwner))
            {
                if (!props.HasProperty("ControlOwner"))
                {
                    paramList.Add(i.ControlOwner);
                    paramCount++;
                    if (innerWhere.Length > 1) innerWhere = innerWhere + " and ";
                    innerWhere = innerWhere + $"{controlOwnerSearch} == @{paramCount}";
                }
            }
            if (!string.IsNullOrWhiteSpace(i.CAR))
            {
                if (!props.HasProperty("BLAH"))
                {
                    paramList.Add(i.CAR);
                    paramCount++;
                    if (innerWhere.Length > 1) innerWhere = innerWhere + " and ";
                    innerWhere = innerWhere + $"{carSearch} == @{paramCount}";
                }
            }
            innerWhere = innerWhere + ")";

            whereClause = whereClause + innerWhere;//This should get me something like "() || () || ()"
            loopCount++;
        }

        return qry.Where(whereClause, paramList.ToArray());
    }

Я тогда называю это так:

IQueryable<MYENTITY> qry = (IQueryable<MYENTITY>)StaticMethod.SearchBySecurityList(
                    input.SecurityFilterList, 
                    GetSearchQueryable(input),
                    "Company.Name",
                    "BLAHProcess.Name",
                    "ProcessOwner",
                    "ControlOwner",
                    "CAR"
                );

РЕДАКТИРОВАТЬ 2: Я переключил свой метод, чтобы использовать T вместо объекта, и это тоже работает.

public static IQueryable<T> SearchBySecurityList<T>(List<SecurityListFilter> caSecurityFilterList, IQueryable<T> qry, string companySearch, string fpSearch, string poSearch, string controlOwnerSearch, string carSearch)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...