我正在尝试按照此页面(http://www.asp.net/mvc/tutorials/mvc-5/introduction/adding-search)中有关如何使用网站下拉列表创建搜索页面的说明进行操作。但似乎无法获得下拉列表。它一直给我这个错误:
System.ArgumentException:DbSortClause表达式必须具有可比较的类型。参数名称:key
问题是:CountryList.AddRange(CountryQry.Distinct());
SEARCH CONTROLLER :::
public ActionResult Index(string location, string searchString)
{
var CountryList = new List<Country>();
var CountryQry = from d in db.Stuffs
orderby d.Country
select d.Country;
CountryList.AddRange(CountryQry.Distinct());
ViewBag.location = new SelectList(CountryList);
var stuff = from m in db.Stuffs
select m;
if (!String.IsNullOrEmpty(searchString))
{
stuff = stuff.Where(s => s.stuffName.Contains(searchString));
}
if (!String.IsNullOrEmpty(location))
{
stuff = stuff.Where(x => x.Country.countryName == location);
}
return View(stuff);
}
VIEW :::
<form>
@using (Html.BeginForm("Index","Search",FormMethod.Get)){
@Html.TextBox("SearchString", new { placeholder = "text" })
@Html.DropDownList("location", "All")
}
</form>
Model :::(这是从数据库自动生成的)
public partial class Stuff
{
public string stuffId { get; set; }
public string stuffName { get; set; }
public string countryId { get; set; }
public virtual Country Country { get; set; }
}
我的c#知识非常有限,因此,我希望有人可以帮助我。 任何帮助表示赞赏!谢谢!
答案 0 :(得分:2)
该错误告诉您Distinct
方法需要一个比较Country
个对象的标准。您的Country
类是一个复杂的类,它可能具有多个属性,并且不实现IComparer
接口。此接口声明了一种比较两个对象的方法,Distinct
方法使用它来查明两个对象是否“相等”。
您应该在IComparer
类中实现IComparable
/ Country
接口。
假设您的Country
类具有类似的结构(关于属性),您可以执行以下操作(根据其名称对两个国家进行比较,但您可以轻松更改比较属性):
public class Country : IComparer
{
public string Name { get; set; }
public string Capital { get; set; }
public int Population { get; set; }
int IComparer.Compare(object a, object b)
{
Country c1=(Country )a;
Country c2=(Country )b;
if (c1.Name < c2.Name )
return 1;
if (c1.Name > c2.Name )
return -1;
else
return 0;
}
}
编辑:可能需要IEqualityComparer
界面而不是IComparer
。
另一个编辑:解决所有这些问题的一种方法是使用:
var uniqueCountries = CountryQry.GroupBy(c => c.Name).Select(g => g.FirstOrDefault());