繁体   English   中英

在EF中使用Lambda进行通配符搜索

[英]Wildcard search in using Lambda in EF

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

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() -方法。

例如,如果第一个搜索l.Id1.EndsWith("123")*123 ,那么我想执行l.Id1.EndsWith("123")

有什么方法可以扩展当前代码,还是应该使用其他方法?

我很确定这是否是您想要的,但是您可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM