System.ArgumentException:DbSortClause表达式必须具有可比较的类型。参数名称:key

时间:2014-01-28 07:35:48

标签: c# drop-down-menu asp.net-mvc-5

我正在尝试按照此页面(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#知识非常有限,因此,我希望有人可以帮助我。 任何帮助表示赞赏!谢谢!

1 个答案:

答案 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());