Linq没有下令而且没有分明

时间:2014-06-11 19:51:50

标签: c# asp.net-mvc linq razor

我有一个MVC 5 .net应用程序,使用Razor视图引擎。我试图从实体框架模型填充下拉列表。这是我在控制器中的linq语句:

private void populateDistrictTypeDropDown(object selectedDistrict = null){
    var query = from d in db.roadways
                orderby d.district
                select d;
    ViewBag.District = new SelectList(query, "district", "District", selectedDistrict).Distinct();
}

但似乎没有订购或只抓取不同的物品,它应该是我看起来的样子。

这是它的样子:

enter image description here

以下是我的观点:

@Html.DropDownListFor(xy => xy.SelectedDistrictTypeIds, new SelectList(Model.DistrictTypesList, "Id", "district")) 

以下是模型:

public class SearchPageModel
{
    public IEnumerable<lkp_roadwaytypes> FacilityTypes { get; set; } // use this to get roadway type, which = FacilityTypes
    public IEnumerable<survey> Surveys { get; set; } // use this to get period to search for from surveydate
    public IEnumerable<roadway> Roadways { get; set; }// use this to get Disctricts and Cost Centers

    // below is for drop down select list on search page
    public int[] SelectedDistrictTypeIds { get; set; }
    public List<roadway> DistrictTypesList { get; set; }

    public int[] SelectedPeriodIds { get; set; }
    public List<survey> PeriodList { get; set; }

    public MainContext myContext = new MainContext();

    public List<roadway>GetDistrictTypes(){
        return myContext.roadways.Where(a=>a.district != null).ToList();
    }
}

为萨米的回答编辑:

使用Equals方法创建了一个新类 -

class District
{
    public int ID {get; set;}
    public int Name { get; set; }

    public bool Equals(District d1, District d2)
    {
        if(d1.ID == d2.ID){return true;}
        else{return false;}
    }
}

将查询更改为 -

private void populateDistrictTypeDropDown(object selectedDistrict = null){
    var query = (from d in db.roadways
                orderby d.district
                select new District {ID = d.ID, Name = d.district}).Distinct();
    ViewBag.District = new SelectList(query, "ID", "Name", selectedDistrict);

}

但是我得到了相同的结果,所以我必须遗漏你说过的话。我应该以某种方式调用equals方法,还是.Distinct()为我做这个?

编辑2:

我注意到我没有在视图中使用ViewBag,因此我将其更改为:

@Html.DropDownListFor(vx => vx.SelectedDistrictTypeIds, new SelectList(ViewBag.District))

但现在我的方框看起来像这样:

enter image description here

3 个答案:

答案 0 :(得分:1)

不要区分SelectList,而是区分查询:

var query = (from d in db.roadways
            orderby d.district
            select d.district)
            .Distinct;

此外,根据Sami,您需要在区域订购和区分,而不是道路(参见更改的选择线)

答案 1 :(得分:0)

您目前正在使用LINQ选择roadway类型的对象。如果你试图区分它们,你将总是得到所有对象,因为它们是不同的,除非你已经定义了相等比较函数。

我想你不想总是按地区ID比较roadway s,所以我建议你创建一个新的类来存储地区名称和ID,从中返回那种类型的对象您的查询,为它定义比较操作,然后您可以区分它。

所以你的查询就像

var query = (from d in db.roadways
                    orderby d.district
                    select new District { ID = d.Id, Name = d.district }).Distinct();

然后,如果您已经定义了Equals方法,那么您的列表应该根据您在那里定义的任何内容进行区分(可能是Id的比较?)

您还必须绑定SelectList以使用District类中的新属性,而不是roadway类。

答案 2 :(得分:0)

好的,不确定这是否是最好的方法,但它对我有用:

把它放在我的模型中:

// populate district drop down
    public IEnumerable<int> populateDistrictTypeDropDown(){
        var query = (from d in myContext.roadways
                    orderby d.district                        
                    select d.district).ToList().Distinct();            

        return query;
    }

这是我的控制者:

 public ActionResult Search()
        {   

            SearchPageModel spm = new SearchPageModel();       

            spm.DistrictTypesList = spm.populateDistrictTypeDropDown();

            return View(spm);
        }

这是我的观点:

 @Html.DropDownListFor(xy => xy.SelectedDistrictTypeIds, new SelectList(Model.DistrictTypesList))