这是从这个问题开始的: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();
我尝试了各种各样,但没有运气。我知道我已经很亲密 - 但需要帮助!帮助赞赏:)
答案 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();