向Linq 2 Sql查询动态添加未确定数量的子句的正确方法是什么?

此函数用于返回用户搜索输入的联系人列表。 搜索词的数量始终至少为一,但可能很多。

public IList GetContacts(string[] searchTerms) { using (dbDataContext db = new dbDataContext()) { var contacts = from _contacts in db.Contacts orderby _contacts.LastName ascending, _contacts.FirstName ascending select _contacts; foreach (string term in searchTerms) { contacts = (IOrderedQueryable)contacts.Where(x => SqlMethods.Like(x.FirstName, "%" + term + "%") || SqlMethods.Like(x.MiddleName, "%" + term + "%") || SqlMethods.Like(x.LastName, "%" + term + "%") || SqlMethods.Like(x.PreferredName, "%" + term + "%")); } return contacts.ToList(); } } 

问题出在循环中。 即使生成的sql看起来正确,也只使用了最后一个搜索词(正如为术语数生成了正确数量的子句)。

示例 – 如果我传递两个术语(’andr’,’sm’),生成的sql显示两个子句块,但只使用’sm’作为两个块中的param。

我究竟做错了什么? 我应该使用SqlMethods吗?

也许问题在于捕获循环变量项。 试试这个:

 foreach (string term in searchTerms) { string t = term; contacts = ... // use t instead of term }