我在网络服务中使用LINQ,在文本框中创建自动完成功能。我已经有了它的工作,但不幸的是结果没有按照我期望的顺序填充,例如,如果我搜索以“carl”开头的饮料我首先期望“carling”然后“carlsberg”但是这个事实并非如此。
正在使用的网络服务是:
public string[] GetProdDesSearch(string prefixText, int count)
{
try
{
ReportingService.ProductsDataContext dbac = new ReportingService.FinalProductsDataContext();
return dbac.FINALPRODUCTSNEWDEMOs
.Where(r => r.MemberId == HttpContext.Current.Session["MemberKey"].ToString() && r.IDDesc.Contains(prefixText))
.OrderBy(r => r.UnitDescription)
.Select(r => r.IDDesc)
.Distinct()
.Take(count)
.ToArray();
}
catch (Exception)
{
return null;
}
}
}
.net详细信息如下:
<asp:TextBox ID="tbxProdAC" runat="server"
style="z-index: 1; left: 200px; top: 460px; position: absolute; height: 20px; width: 345px;"
CssClass="completionList2" AutoPostBack="True"
ontextchanged="tbxProdAC_TextChanged"></asp:TextBox>
<cc1:AutoCompleteExtender ID="tbxProdAC_AutoCompleteExtender" runat="server"
DelimiterCharacters="" Enabled="True"
ServicePath="~/Reporting/GetProd.asmx"
ServiceMethod="GetProdDesSearch"
TargetControlID="tbxProdAC"
CompletionInterval="50" CompletionSetCount="50"
MinimumPrefixLength="3"
onclientpopulating="ShowImage"
onclientpopulated="HideImage"
CompletionListCssClass="completionList2">
</cc1:AutoCompleteExtender>
.completionList2 {font-family: Trebuchet MS;font-size:11px; border:solid 1px #444444;margin:0px;padding:2px;height: 395px;
overflow:auto; background-color:White;
z-index: 1;
left: 200px;
top: 310px;
position: absolute;
width: 1496px;
}
如果有人能以我的方式指出错误,我将非常感激。
答案 0 :(得分:2)
我找到了答案。
distinct应该放在webservice中我的LINQ查询中的orderby之前:
return dbac.FINALPRODUCTSNEWDEMOs
.Where(r => r.MemberId == HttpContext.Current.Session["MemberKey"].ToString() && r.IDDesc.Contains(prefixText))
.Distinct()
.OrderBy(r => r.IDDesc)
.Select(r => r.IDDesc)
.Take(count)
.ToArray();
答案 1 :(得分:1)
您按UnitDescription
排序,但prefixText
和最终选定项目的约束均为IDDesc
。您应该使用哪个并不明显,但我认为您应该保持一致 - 可以按IDDesc
订购,也可以使Contains
和Select
来电也使用UnitDescription
。< / p>