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