Entity framework Linq到实体复杂动态搜索

Entity framework Linq到实体复杂动态搜索,entity-framework,dynamic,linq-to-entities,Entity Framework,Dynamic,Linq To Entities,我们正在使用实体框架MySQL连接器,并在我们的web应用程序上创建一个中心搜索工具 除了他使用预定义的实体和属性之外,这几乎正是我需要的。在我们的搜索场景中,我们将有一个动态数量的搜索词和字段,即:用户选择搜索姓氏、值和城市,或提供商和顾问 是否可以使用LINQ实现这种功能,以便我们可以利用延迟加载机制?如果可能的话,我真的希望避免生成SQL字符串。我查看了,但无法使其正常工作。我知道您表示希望避免生成SQL字符串,但这通常是最简单的方法。比自定义表达式树容易得多。如果您是在EF中执行此操作的

我们正在使用实体框架MySQL连接器,并在我们的web应用程序上创建一个中心搜索工具

除了他使用预定义的实体和属性之外,这几乎正是我需要的。在我们的搜索场景中,我们将有一个动态数量的搜索词和字段,即:用户选择搜索姓氏、值和城市,或提供商和顾问


是否可以使用LINQ实现这种功能,以便我们可以利用延迟加载机制?如果可能的话,我真的希望避免生成SQL字符串。我查看了,但无法使其正常工作。

我知道您表示希望避免生成SQL字符串,但这通常是最简单的方法。比自定义表达式树容易得多。如果您是在EF中执行此操作的,我建议您检查实体Sql,它对您的概念模型有效,但允许比LINQ更多的动态查询选项。LINQ非常适合编译时查询,而不是运行时查询。您可以在上阅读实体SQL

从上周开始,我们面临着一个类似的问题,这里是我刚刚想到的一个想法。我想和你分享一下

interface IPerson
{            
    DateTime BirthDay { get; set; }

    string City { get; set; }            

    string FirstName { get; set; }

    string LastName { get; set; }
}

interface IFilter { }

interface IPersonFilter : IFilter { }

class PersonFilter : IPersonFilter
{            
    public DateTime? BirthDay { get; set; }

    public string City { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }            
}

static IQueryable<TSource> ApplyFilter<TSource, TFilter>(IQueryable<TSource> source, TFilter filter) where TFilter : IFilter
{
    const BindingFlags bindingFlags = BindingFlags.Public|BindingFlags.Instance|BindingFlags.GetProperty;

    var retval = source;
    foreach (var filterProperty in filter.GetType().GetProperties(bindingFlags))
    {
        var elementParameter = Expression.Parameter(source.ElementType, "type");
        var elementProperty  = Expression.Property(elementParameter, filterProperty.Name);

        var value = filterProperty.GetGetMethod().Invoke(filter, null);
        if (value != null)
        {
            var constantValue = Expression.Constant(value, elementProperty.Type);
            var expression = Expression.Equal(elementProperty, constantValue);
            retval = retval.Where(Expression.Lambda<Func<TSource, bool>>(expression, elementParameter));
        }
    }

    return retval;
}

这样的想法是,您有一个过滤器,其中过滤器属性的名称与要运行过滤器的对象的属性名称匹配。如果属性的值不为null,我将为它构建一个表达式。为了简单起见,我确实构建了表达式。只构建了相等的表达式,但我正在考虑扩展它。

建议返回SQL,因为它很简单,根本不是一个好的选择。我不建议返回SQL,我建议继续使用实体SQL。您能提供更多信息吗,如何使您的输入比第一个链接中的输入数据更具动态性。也许是一个简单的例子,你已经尝试过并且想要达到的目标。