使用LINQ返回连接字符串以进行下拉列表

时间:2011-04-11 22:56:52

标签: c# linq

这是从这个问题开始的:Format List<T> to concatenate fields。答案是正确的,但是回复后我想从方法中返回List,以便可以重复使用。我做到了这一点,但这不正确(因为我知道Iqueryable不正确,它只是阻止了AnonymousType错误):

public static IQueryable GetCitiesInCountryWithState(string isoalpha2)
    {
        const string delimiter = ", ";
        using (var ctx = new atomicEntities())
        {
            var query = (from c in ctx.Cities
                        join ctry in ctx.Countries on c.CountryId equals ctry.CountryId
                        where ctry.IsoAlpha2 == isoalpha2
                        select new
                                   {
                                       CityId = c.CountryId,
                                       CityName = c.CityName + delimiter + c.State
                                   });
            return query;
        }
    }

我希望能够在此处返回List<string>(如果可能),然后在用户界面上执行以下操作:

ddlCity.DataSource = GetCitiesInCountryWithState(Session["BusinessCountry"].ToString());
            ddlCity.DataTextField = "CityName";
            ddlCity.DataValueField = "CityId";
            ddlCity.DataBind();

我尝试了各种各样,但没有运气。我知道我已经很亲密 - 但需要帮助!帮助赞赏:)

3 个答案:

答案 0 :(得分:3)

您无法返回匿名类型,编译器无法维护类型安全。

所以如果你定义一个类

class City {
  public int CityId {get; set;}
  public string CityName {get; set;}
}

将select new {}替换为select new City {}并返回List&lt; City&gt;或IQueryable&lt; City&gt;你应该没事。

答案 1 :(得分:2)

您可以选择以下选项:

在您的City实体上,我假设您拥有EDM工具生成的部分类的一部分,并且您可能拥有部分类的另一部分,其中包含的代码不是来自EDM生成。

在分部类的非生成部分中,您可以添加一个瞬态属性,该属性将CityName和State作为只读字符串(参见下文)。瞬态意味着该属性不会持久保存到数据库,并且通常是从某些现有字段生成的。在ViewModels中使用了这种技术,为视图提供了更多UI友好的属性。

public partial class City
{
    public string CityNameAndState
    {
        get
        {
            return CityName + delimiter + State;
        }
    }
}

然后,您可以将其用作绑定中City对象的DataTextField。如果你走这条路,我不认为你在查询中需要一个匿名类型 - 你可以按原样返回City对象。这样做的好处与从查询返回自定义对象的好处是,如果在类上定义属性,您将始终拥有它,无论您使用什么查询来检索城市,它都将始终有效

希望有意义......我对你的项目设置做了一些假设。

答案 2 :(得分:1)

为了扩大你对克里斯所说的话。

class City 

{

   public int CityId {get; set;}
   public string CityName {get; set;}

}

然后

public static List<City> GetCitiesInCountryWithState(string isoalpha2)
{
    const string delimiter = ", ";
    using (var ctx = new atomicEntities())
    {
        var query = (from c in ctx.Cities
                    join ctry in ctx.Countries on c.CountryId equals ctry.CountryId
                    where ctry.IsoAlpha2 == isoalpha2
                    select new City
                               {
                                   CityId = c.CountryId,
                                   CityName = c.CityName + delimiter + c.State
                               }).ToList();
        return query;
    }
}


var cityList = GetCitiesInCountryWithState(Session["BusinessCountry"].ToString());
ddlCity.DataSource = cityList;
ddlCity.DataTextField = "CityName";
ddlCity.DataValueField = "CityId";
ddlCity.DataBind();