我有两个链接的对象,States
和Cities
,因此每个State
都有Cities
,每个Citie
都链接到State
1}}。我还有一些Units
stateID
和citieID
,但它们没有链接,因为我只在Json中使用它们。
我需要的是只获得States
和Cities
Units
。我设法得到前两个,但是想知道是否有更快的方法来做,因为我将不得不每天对这些数据进行更新:
//unitsData have a List of Units objects, this only have stateID, citieID and the unit data
var unitsData = objUnidade.BuscaUnidades();
//unitsState have all units grouped by State, here i also only have stateID and citieID, same data as above
var unitsState = unitsData.GroupBy(x => x.codigoEstado);
//Here is where i make my search inside the unidadesEstados and select only the Estados that i need
var activeStates = unitsState.Select(est => db.States.FirstOrDefault(x => x.ID == est.Key)).Where(state => state != null).ToList();
要做城市搜索,我正在做同样的事情,但是使用额外的foreach,有没有办法让这更好?
答案 0 :(得分:1)
如果db.States
查询数据库,则unitsState
中的每个组都将执行查询。如果状态数不是很大,您可以将它们存储在列表中。
var dbStates = db.States.ToList();
var activeStates = unitsState.Select(est => dbStates.FirstOrDefault(x => x.ID == est.Key)).Where(state => state != null).ToList();
答案 1 :(得分:1)
您正在多次查询数据库。最好使用SELECT ... IN查询,在LINQ中看起来像:
var units = objUnidad.BuscaUnidades();
var stateIds = units.Select(u => u.codigoEstado).ToList();
var activeStates = db.States.Where(s => stateIds.Contains(s.Id)).ToList();
编辑:你也问过城市问题。它更像是:
var cityIds = units.Select(u => u.codigoCuidad).ToList()
var activeCities = db.Cities.Where(c => cityIds.Contains(c.Id)).ToList();
此解决方案为您提供每个城市,其ID由一个单位引用。 @StriplingWarrior的解决方案将为您提供(拥有单位的州)的每个城市。