如何搜索表格中的所有字段,我在下面为ANYFIELD提供了什么?
由于
var tblequipments = from d in db.tblEquipments.Include(t => t.User).Include(t => t.ChangeLog).Include(t => t.AssetType)
where d."ANYFIELD" == "VALUE" select d;
答案 0 :(得分:4)
你做不到。您必须单独比较每个字段。鉴于字段可能与您要比较的对象的类型不同,所以比较所有字段没有意义。
答案 1 :(得分:3)
你可以使用反射。试试这个:
static bool CheckAllFields<TInput, TValue>(TInput input, TValue value, bool alsoCheckProperties)
{
Type t = typeof(TInput);
foreach (FieldInfo info in t.GetFields().Where(x => x.FieldType == typeof(TValue)))
{
if (!info.GetValue(input).Equals(value))
{
return false;
}
}
if (alsoCheckProperties)
{
foreach (PropertyInfo info in t.GetProperties().Where(x => x.PropertyType == typeof(TValue)))
{
if (!info.GetValue(input, null).Equals(value))
{
return false;
}
}
}
return true;
}
你的LINQ查询:
var tblequipments = from d in db.tblEquipments.Include(t => t.User).Include(t => t.ChangeLog).Include(t => t.AssetType) where CheckAllFields(d, "VALUE", true) select d;
如果您要检查所有字段和所有属性,则第三个参数应为true
;如果您只想检查所有字段,则第三个参数应为false
。
答案 2 :(得分:1)
编辑:有人已经构建了这个...请参阅here。
不是一个完整的答案,但我不同意断言你只是不能 ......
你可以想出一个扩展方法,根据类似类型的属性动态过滤IQueryable / IEnumerable(我猜db
变量的IQueryable)。这是在Linqpad中掀起的一些东西。它引用了PredicateBuilder,并不是完整/完全准确的,但我在Linq-to-SQL上对我的一些表进行了测试,并且它按照描述工作。
void Main()
{
YourDbSet.WhereAllPropertiesOfSimilarTypeAreEqual("A String")
.Count()
.Dump();
}
public static class EntityHelperMethods
{
public static IQueryable<TEntity> WhereAllPropertiesOfSimilarTypeAreEqual<TEntity, TProperty>(this IQueryable<TEntity> query, TProperty value)
{
var param = Expression.Parameter(typeof(TEntity));
var predicate = PredicateBuilder.True<TEntity>();
foreach (var fieldName in GetEntityFieldsToCompareTo<TEntity, TProperty>())
{
var predicateToAdd = Expression.Lambda<Func<TEntity, bool>>(
Expression.Equal(
Expression.PropertyOrField(param, fieldName),
Expression.Constant(value)), param);
predicate = predicate.And(predicateToAdd);
}
return query.Where(predicate);
}
// TODO: You'll need to find out what fields are actually ones you would want to compare on.
// This might involve stripping out properties marked with [NotMapped] attributes, for
// for example.
private static IEnumerable<string> GetEntityFieldsToCompareTo<TEntity, TProperty>()
{
Type entityType = typeof(TEntity);
Type propertyType = typeof(TProperty);
var fields = entityType.GetFields()
.Where (f => f.FieldType == propertyType)
.Select (f => f.Name);
var properties = entityType.GetProperties()
.Where (p => p.PropertyType == propertyType)
.Select (p => p.Name);
return fields.Concat(properties);
}
}
未解决部分的有用资源:
答案 3 :(得分:1)
如果这对某人有所帮助。
首先在Customer类中查找与查询类型相同的所有属性:
response
然后从具有至少一个值等于query的属性的上下文中查找所有客户:
var stringProperties = typeof(Customer).GetProperties().Where(prop =>
prop.PropertyType == query.GetType());