我正在使用Entity Framework 7 RC1 Code First
我有一个函数需要返回链接到User的国家/地区(ID,名称)列表。 用户不直接链接到国家/地区,但通过城市链接。城市与国家有关。国家与国家有关。
以下LINQ查询语法查询返回一个已排序的唯一国家/地区列表。
public async Task<IEnumerable<Country>> Search(int userId)
{
IQueryable<Country> table = from co in _db.Countries
join st in _db.States on co.CountryId equals st.CountryId
join ci in _db.Cities on ci.StateId equals st.StateId
where (ci.UserId == userId)
select co;
return await table.Distinct().OrderBy(co => co.CountryName).ToListAsync();
}
但是我需要用Linq方法语法
来编写它public async Task<IEnumerable<Country>> Search(int userId)
{
IQueryable<Country> = _db.Cities
.Include(ci => ci.State.Country)
.Where(c => c.UserId == userId)
.Select(ci => ci.States.Country)
;
return await table.Distinct().ToListAsync();
}
这样可行,但数据未排序。
如果我将其更改为待排序
public async Task<IEnumerable<Country>> Search(int userId)
{
IQueryable<Country> table = _db.Cities
.Include(ci => ci.States.Country)
.Where(c => c.UserId == userId)
.Select(ci => ci.States.Country)
;
return await table.Distinct().OrderBy(co => co.CountryName).ToListAsync();
}
给我一个运行时错误
InvalidOperationException:Sequence不包含匹配元素
如果我将orderby移动到select
之后public async Task<IEnumerable<Country>> Search(int userId)
{
IQueryable<Country> table = _db.Cities
.Include(ci => ci.States.Country)
.Where(c => c.UserId == userId)
.Select(ci => ci.States.Country)
.OrderBy(co => co.CountryName)
;
return await table.Distinct().ToListAsync();
}
它有效,但不按排序顺序返回
当我尝试使用groupby时
public async Task<IEnumerable<Country>> Search(int userId)
{
IQueryable<Country> table = _db.Cities
.Include(ci => ci.States.Country)
.Where(c => c.UserId == userId)
.Select(ci => ci.States.Country)
.GroupBy(ci => ci.States.Country)
.Select(co => co.FirstOrDefault())
.OrderBy(co => co.CountryName)
;
return await table.ToListAsync();
}
我收到以下运行时错误
InvalidOperationException:Sequence包含多个元素
问题:如何用LINQ方法语法编写查询?