C# 无法从联接表和条件where子句中检索记录

C# 无法从联接表和条件where子句中检索记录,c#,sql,sql-server,linq-to-sql,C#,Sql,Sql Server,Linq To Sql,我的案例描述: 在我的C和LINQtoSQL应用程序中,我正在实现FeserWard.Controls Intellibox。对于手持电话的销售,用户将在intellibox中键入手持电话的IMEI,该框将在handphone表中进行搜索,以查找用户输入的IMEI,并最终显示精确匹配的IMEI记录 问题:我想过滤掉所有状态为Available Item.I_status=Available的Handphone.IMEI,从那里,当用户键入IMEI时,intellibox列表将仅从可用IMEI进行

我的案例描述: 在我的C和LINQtoSQL应用程序中,我正在实现FeserWard.Controls Intellibox。对于手持电话的销售,用户将在intellibox中键入手持电话的IMEI,该框将在handphone表中进行搜索,以查找用户输入的IMEI,并最终显示精确匹配的IMEI记录

问题:我想过滤掉所有状态为Available Item.I_status=Available的Handphone.IMEI,从那里,当用户键入IMEI时,intellibox列表将仅从可用IMEI进行搜索

SQL

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

当前可行的方法:IEnumerable DoSearch

表1:

表2:


正如Joh SkeetA SO Hero提到的,您不应该在查询中使用ToList,因为它将提示要执行的查询,并且您将获取完整的表数据到客户端站点上加入它们的客户端。让Linq使用join生成查询表达式,并将其发送到DB,以便在DB端进行join,从而延迟执行。副作用少

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

由于您只需要手机信息->最好将i从选择项中排除,请仅选择您将使用的内容

最后一个addtolist返回结果以获取数据

下面是您的新查询:

     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();
如果这仍然没有帮助

验证两个表中的数据是否具有联接条件

打开SSMS,运行SQL Server探查器并选中生成的查询。尝试手动运行该查询,以确定是否提取了数据


正如Joh SkeetA SO Hero提到的,您不应该在查询中使用ToList,因为它将提示要执行的查询,并且您将获取完整的表数据到客户端站点上加入它们的客户端。让Linq使用join生成查询表达式,并将其发送到DB,以便在DB端进行join,从而延迟执行。副作用少

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

由于您只需要手机信息->最好将i从选择项中排除,请仅选择您将使用的内容

最后一个addtolist返回结果以获取数据

下面是您的新查询:

     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();
如果这仍然没有帮助

验证两个表中的数据是否具有联接条件

打开SSMS,运行SQL Server探查器并选中生成的查询。尝试手动运行该查询,以确定是否提取了数据


你为什么经常给托利斯打电话?这是将表中的所有数据拉入内存,而不是在数据库中执行查询。。。坏主意。@JonSkeet:也许他需要这样做是因为StringComparison。OrdinalIgnoreCase?@Arion:我以为LINQ to SQL支持这个,尽管我可能错了。但至少连接可以在数据库中完成。。。然后可能使用一个可计算的而不是ToList。@JonSkeet:对不起,我的错。它支持它。是的,我同意。联接应该在数据库中。@user2889026:我不明白。有什么问题吗?你为什么经常给托利斯打电话?这是将表中的所有数据拉入内存,而不是在数据库中执行查询。。。坏主意。@JonSkeet:也许他需要这样做是因为StringComparison。OrdinalIgnoreCase?@Arion:我以为LINQ to SQL支持这个,尽管我可能错了。但至少连接可以在数据库中完成。。。然后可能使用一个可计算的而不是ToList。@JonSkeet:对不起,我的错。它支持它。是的,我同意。联接应该在数据库中。@user2889026:我不明白。有什么问题?
    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;
    }
Item (PK = I_ID)
Handphone (PK,FK1 = HP_ID), where Item.I_ID = Handphone.HP_ID
     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();