【问题标题】:Wildcard search in using Lambda in EF在 EF 中使用 Lambda 进行通配符搜索
【发布时间】:2013-06-13 12:46:10
【问题描述】:

我有一个带有可选参数的搜索:

string id1 = HttpContext.Current.Request["id1"];
string id2 = HttpContext.Current.Request["id2"];

List<Foo> list = context.Foo.Where(l => 
     (string.IsNullOrEmpty(id1) || l.Id1.Contains(id1)) &&
     (string.IsNullOrEmpty(id2) || l.Id2.Contains(id2)))
     .Take(10)
     .ToList());

我想扩展它,如果字符串以* 开头,则应该使用EndsWith() - 方法。

例如,如果第一个搜索字符串是*123,我想做一个l.Id1.EndsWith("123")

有什么方法可以扩展我当前的代码,还是应该使用不同的方法?

【问题讨论】:

  • 我认为除非您有特定的理由使用 StartsWith 或 EndsWith,否则 Contains 会给您更多的灵活性
  • @Stokedout 好吧,我问一个原因:-)

标签: c# asp.net linq lambda


【解决方案1】:

我很确定这是否是您的意图,但您可以使用IQueryable(T) 打破您的逻辑。在您尝试使用该集合之前,不会执行查询。

public IList<Foo> Search(DbContext<Foo> context, string id1, string id2)
{
    Func<Foo, bool> predicate = l =>
            (string.IsNullOrEmpty(id1) || l.Id1.Contains(id1))
            && (string.IsNullOrEmpty(id2) || l.Id2.Contains(id2)));

    IQueryable<Foo> list = context.Foo.Where(predicate);

    if(id1.StartsWith("*") && id1.Length > 1)
    {
        var searchTerm = id1.Substring(1, id1.Length);
        list = list.Where(l => l.EndsWith(searchTerm));
    }

    return list.Take(10).ToList(); // Execution occurs at this point
}

构建查询:

public void BasicSearch(IQueryable<foo> list, string id1, string id2)
{
    Func<Foo, bool> predicate = l =>
            (string.IsNullOrEmpty(id1) || l.Id1.Contains(id1))
            && (string.IsNullOrEmpty(id2) || l.Id2.Contains(id2)));

    list.Where(predicate);
}

public void WildcardSearch(IQueryable<Foo> list, string id1)
{
    if(!id1.StartsWith("*") || id1.Length <= 1) return;

    var searchTerm = id1.Substring(1, id1.Length);
    list.Where(l => l.EndsWith(searchTerm));
}

IQueryable<Foo> list = context.Foo;

BasicSearch(list, id1, id2);
WildcardSearch(list, id1);
var result = list.Take(10); // Execution occurs at this point

【讨论】:

  • 谢谢。我看到的问题是,这将在很多情况下结束。我希望能够将它添加到predicate 函数中。但也许它是一个很好的解决方案。
  • 我只是将你的逻辑分成不同的方法,这样你就可以建立一个查询。我将在中编辑一个示例。
猜你喜欢
  • 1970-01-01
  • 2015-05-12
  • 2021-10-21
  • 1970-01-01
  • 2011-03-23
  • 2019-03-08
  • 2023-03-05
  • 1970-01-01
  • 2017-04-30
相关资源
最近更新 更多