C# 无法从联接表和条件where子句中检索记录
我的案例描述: 在我的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: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进行
正如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();