Я не уверен, что есть лучший ответ, но в настоящее время это работает для меня.
В начале метода я делаю это:
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)