如何在实体框架中使用Like运算符lamba表达式

时间:2015-12-02 11:03:44

标签: c# sql lambda entity-framework-4

我正在为搜索编写一个sql查询,用户根据FirstName和LastName进行搜索。搜索FirstName或LastName时查询工作正常,但是当我搜索FirstName和LastName(即FirstName和LastName之间的空格)时,它会给出空白结果。查询字符串如下所示:
 [...]

sql查询是:http://localhost:4562/api/User/Search?q=sumedha%20v&filters=&offset=3&limit=9

我尝试使用List<AppUser> searchedAppUsers = await _context.AppUser.Where(u => u.Profile.FirstName.StartsWith(q) || u.Profile.LastName.StartsWith(q)).ToListAsync();代替Contains(),但仍然会显示空白结果。我也尝试使用StartsWith()但在intellisense中看不到它。我尝试使用SqlMethods.Like(),但同样的问题。我试着关注this帖子,但是我知道怎么做 还有其他方法吗?或者我在某个地方出错?

2 个答案:

答案 0 :(得分:4)

好吧,如果您的搜索字词是&#34; sumedha v&#34;很明显,没有FirstNameLastName包含此字符串。你显然在寻找这样的东西:

_context.AppUser
        .Where(u => (u.Profile.FirstName + " " + u.Profile.LastName).Contains(q))

但这可能表现不佳,因为现在查询引擎无法在名称字段上使用任何索引。如果没有多少(数千)用户,这不应该是一个问题。

也许您打算分别使用搜索字符串的第一部分和第二部分对FirstNameLastName进行搜索?像这样:

var parts = q.Split(q, ' ');
var q1 = parts[0];
var q2 = parts[1];
var result = _context.AppUser
                     .Where(u => u.Profile.FirstName.Contains(q1)
                         && u.Profile.LastName.Contains(q2));

(没有空检查)

这样做会更好,因为名字字段是直接查询的。

答案 1 :(得分:0)

首先,您的查询仅检查FirstName:

列出的searchAppUsers = await _context.AppUser.Where(u =&gt; u.Profile。 FirstName .StartsWith(q)|| u.Profile。 FirstName .StartsWith (q))ToListAsync();

其次据我所知,你正在寻找类似于&#34; John Doe&#34;但是,FirstName(&#34; John&#34;)和LastName(&#34; Doe&#34;)都不是以&#34; John Doe&#34; (或 LIKE&#39; John Doe%&#39; )。

再想一想你的SQL是什么。