【问题标题】:What is the correct way to dynamically add an undetermined number of clauses to a Linq 2 Sql query?将不确定数量的子句动态添加到 Linq 2 Sql 查询的正确方法是什么?
【发布时间】:2010-09-15 14:06:48
【问题描述】:

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

public IList<Contact> 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<Contact>)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<Contact>();
    }
}

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

示例 - 如果我传递两个术语 ('andr','sm'),生成的 sql 将显示两个子句块作为 expeted,但仅使用 'sm' 作为两个块中的参数。

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

【问题讨论】:

  • 你说生成的SQL看起来是对的,能贴一下吗?您是否尝试过手动运行生成的 SQL?
  • 是的,如果我手动运行它就可以工作,它只是使用数组中的最后一个“术语”作为所有参数的参数。奇怪。

标签: c# .net linq-to-sql


【解决方案1】:

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

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

【讨论】:

  • 你知道为什么会这样吗?
  • 因为您正在关闭一个循环变量,所以当您运行查询时,查询项始终是传入数组中的最后一个值。看到这个问题:stackoverflow.com/questions/227820/…
  • 这种行为是 linq 2 sql 独有的吗?因为延迟性?
猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 2015-01-23
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
相关资源
最近更新 更多