1

我的案例描述: 在我的 C# 和 LINQ to SQL 应用程序中,我正在实现 FeserWard.Controls Intellibox。对于手机的销售,用户在智能框中输入手机的IMEI,框会在Table Handphone中搜索,查找用户输入的IMEI,最后显示完全匹配的IMEI记录。

问题:我想过滤掉所有 status=Available (Item.I_Status="Available") 的 (Handphone.IMEI),然后从那里,当用户输入 IMEI 时,智能框列表将仅从可用 IMEI 中进行搜索。

SQL

    select h.HP_ID, h.IMEI, h.Colour, i.I_Status
    from Item i, Handphone h
    where i.I_ID = h.HP_ID AND i.I_Status='Available'

我想用这个替换 IEnumerable DoSearch 的 LINQ 但卡住了。

    var availableIMEISearch = from i in dataContext.Items.ToList()
                              join h in dataContext.Handphones.ToList()
                              on i.I_ID equals h.HP_ID
                              where(h.IMEI.StartsWith(searchTerm, StringComparison.OrdinalIgnoreCase)) && (i.I_Status=="Available")
                              select new { i, h };
    return availableIMEISearch;

当前可行的方法:IEnumerable DoSearch

    DataClasses1DataContext dataContext = new DataClasses1DataContext();
    public IEnumerable DoSearch(string searchTerm, int maxResults, object extraInfo)
    {
        var imeiSearch = dataContext.Handphones.ToList()
        .Where(h => h.IMEI.StartsWith(searchTerm, StringComparison.OrdinalIgnoreCase));
        return imeiSearch;
    }

表格1:

Item (PK = I_ID)

表2:

Handphone (PK,FK1 = HP_ID), where Item.I_ID = Handphone.HP_ID
4

1 回答 1

1

正如 Joh Skeet(A SO Hero)所提到的,你不应该ToList在查询中使用,因为它会提示查询被执行,并且你将获取完整的表数据给客户端,在客户端加入它们。让Linq生成带有join的查询表达式,并将其发送到DB以便在DB端进行join,延迟执行。副作用少。

您没有提到是否需要对 searchterm 进行区分大小写的搜索,但我认为不区分大小写更方便,所以只需删除StringComparison.

由于您只需要手机信息 -> 更好地i从选择术语中排除,因此请仅选择您将使用的内容。

最后添加ToList到返回结果以获取数据。

所以这是你的新查询:

     var availableIMEISearch = from i in dataContext.Items
                          join h in dataContext.Handphones
                          on i.I_ID equals h.HP_ID
                          where(h.IMEI.StartsWith(searchTerm) && (i.I_Status=="Available")
                          select h;
return availableIMEISearch.ToList();

如果这仍然没有帮助。

  1. 验证您在两个表中都有连接条件的数据;

  2. 打开 SSMS,运行 SQL Server Profiler 并检查生成的查询。尝试手动运行该查询以查明是否获取了数据。

于 2013-10-17T06:24:30.440 回答