我的案例说明: 在我的C#和LINQ to SQL应用程序中,我正在实现FeserWard.Controls Intellibox。对于手机的销售,用户将在intellibox中键入手机的IMEI,该框将在Table Handphone中搜索以查找用户输入IMEI,最后显示完全匹配的IMEI记录。
问题:我想过滤掉所有(Handphone.IMEI)状态=可用(Item.I_Status =“可用”),并从那里,当用户输入IMEI时,intellibox list只会从Available 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
答案 0 :(得分:1)
正如Joh Skeet(一个SO Hero)所提到的,你不应该在查询中使用ToList
,因为它将促使查询被执行,并且你将获取完整的表数据给客户端在客户端站点加入它们。让Linq使用join生成查询表达式,并将其发送到DB以便在DB端进行连接,延迟执行。减少副作用。
您没有提到是否需要区分大小写搜索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();
如果仍然没有帮助。
验证两个表中的数据是否都有连接条件;
打开SSMS,运行SQL Server Profiler并查看生成的查询。尝试手动运行该查询以确定是否获取数据。