如何搜索LINQ表中的所有字段?

时间:2013-07-30 16:15:45

标签: linq entity-framework

LINQ中的

如何搜索表格中的所有字段,我在下面为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;

4 个答案:

答案 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());