C# 按名称切换数据库集
我已经找了几个小时的答案了。我读过很多类似的帖子,但还是没能说到点子上。 在定位ASPNET MVC网站时,我需要根据用户ip在“n”个表之间切换。 所有表格都被命名为“GeoData_u2;”加上方便的国家代码后缀(IT、FR、US…)。此外,由于它们都包含相同的字段,因此它们从相同的“地理数据”接口继承 我知道我可以通过以下方式在控制器中获得所需的dbset:C# 按名称切换数据库集,c#,linq,C#,Linq,我已经找了几个小时的答案了。我读过很多类似的帖子,但还是没能说到点子上。 在定位ASPNET MVC网站时,我需要根据用户ip在“n”个表之间切换。 所有表格都被命名为“GeoData_u2;”加上方便的国家代码后缀(IT、FR、US…)。此外,由于它们都包含相同的字段,因此它们从相同的“地理数据”接口继承 我知道我可以通过以下方式在控制器中获得所需的dbset: string countryTable = "GeoData_" + Server.HtmlEncode(Request.Cooki
string countryTable = "GeoData_" + Server.HtmlEncode(Request.Cookies["_country"].Value.ToUpper());
var type = Assembly.GetExecutingAssembly()
.GetTypes()
.FirstOrDefault(t => t.Name == countryTable);
DbSet GeoContext = db.Set(type);
现在,我不能像以前那样通过这个DbSet,也就是说
var searchResult = GeoContext
.Where(c => c.PlaceName.ToUpper().Contains(term.ToUpper()))
.Select(c => new
{
PlaceName = c.PlaceName,
PostalCode = c.PostalCode,
GeoDataID = c.ID,
Latitude = c.Latitude,
Longitude = c.Longitude
}
)
.Distinct()
.OrderBy(c => (c.PlaceName.ToUpper().IndexOf(term.ToUpper())))
.ToList();
因为模型的字段(c.Placename等)不能再引用到GeoContext
我认为一种方法是使用System.Linq.Dynamic并因此更改整个查询。
有没有办法利用从同一接口继承的所有表来获得更好的解决方法?尝试显式定义DbSet类 像
DbSet GeoContext=db.Set(类型);
我猜您在代码中的某个地方定义了这个类您能以任何方式更改表吗?您真的需要为每个国家/地区代码单独设置表吗?为什么不添加另一列(例如,
LanguageID
)并使用一个表呢?不应该这样做,如果需要拆分表,让sql server来处理。David:数百个表,每个国家一个,每个人都包含数十万个地理位置数据。不,我不能用一张桌子。基思:不知道你的意思。谢谢你的回答。我是来学习的,所以,请确定,您是否真的建议最好的选择是使用和维护一个包含数千万条记录的表?
DbSet<Class> GeoContext = db.Set<Class>(type);