C# 返回带有LINQ的串联字符串以用于下拉

C# 返回带有LINQ的串联字符串以用于下拉,c#,linq,C#,Linq,以下是此问题的后续内容:。答案是正确的,但在发布答案后,我想从该方法返回列表,以便可以重复使用。我已经做到了这一点,但这是不正确的(因为我知道Iqueryable是不正确的,它只是防止了AnonymousType错误): 我希望能够在此处返回列表(如果可能),然后在UI上执行类似操作: ddlCity.DataSource = GetCitiesInCountryWithState(Session["BusinessCountry"].ToString()); ddlCi

以下是此问题的后续内容:。答案是正确的,但在发布答案后,我想从该方法返回
列表
,以便可以重复使用。我已经做到了这一点,但这是不正确的(因为我知道
Iqueryable
是不正确的,它只是防止了
AnonymousType
错误):

我希望能够在此处返回
列表
(如果可能),然后在UI上执行类似操作:

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

我试过各种方法,但都不走运。我知道我已经很接近了,但是需要帮助!感谢帮助:)

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

所以如果你定义一个类
class City {
  public int CityId {get; set;}
  public string CityName {get; set;}
}
class城市{
public int CityId{get;set;}
公共字符串CityName{get;set;}
}


用select new City{}替换select new{},并返回一个列表或IQueryable。您应该可以选择以下选项:

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

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

public partial class City
{
    public string CityNameAndState
    {
        get
        {
            return CityName + delimiter + State;
        }
    }
}
然后,您可以在绑定中将其用作城市对象的DataTextField。如果你这样做的话,我认为你不需要在查询中使用匿名类型——你只需要按原样返回City对象。这样做与从查询返回自定义对象相比的好处是,如果在类上定义了属性,那么您将始终拥有它,并且无论您使用什么查询来检索城市,它都将始终工作相同


希望这有意义。。。我对你的项目是如何设置的做了一些假设。

以克里斯所说的为例为你展开

class City 
{

}

然后

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();
公共静态列表GetCitiesInCountryWithState(字符串isoalpha2)
{
常量字符串分隔符=“,”;
使用(var ctx=new atomicEntities())
{
var query=(来自ctx.Cities中的c)
在ctx中加入ctry。c.CountryId上的国家等于ctry.CountryId
其中ctry.IsoAlpha2==IsoAlpha2
选择新城市
{
CityId=c.CountryId,
CityName=c.CityName+分隔符+c.State
}).ToList();
返回查询;
}
}
var cityList=GetCitiesInCountryWithState(会话[“BusinessCountry”].ToString());
ddlCity.DataSource=cityList;
ddlCity.DataTextField=“CityName”;
ddlCity.DataValueField=“CityId”;
ddlCity.DataBind();

那么您是说您不能将匿名类型设置为
.DataSource
?您可能可以将其设置为DataSource,因为数据源将被反映,因此不需要进行类型检查。但是你不能从一个方法返回一个匿名类型,因为你不能有一个“var”的返回类型,调用者不会知道它是什么+这听起来……太棒了。我必须开始在我的一些项目中使用它。我不知道你能做到这一点,但看到代码它似乎是如此明显!:)我和@Sergio在这件事上有过合作。我也不知道你能这么做!我确实在EF4.0上运行,并使用POCO模板;因此,这-虽然不是我所期望的,是正确的答案+1谢谢你@Andy White,极好的回答:)
   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();