按名称切换DbSet

时间:2017-03-11 23:16:49

标签: c# linq

我几个小时都在寻找答案。我已经阅读了很多类似的帖子,但仍然无法达到目的。 在ASPNET MVC网站的地理定位中,我需要根据用户ip在'n'表之间切换。 所有表都被命名为'GeoData_'以及方便的countryCode后缀(IT,FR,US ...)。此外,由于它们都包含相同的字段,因此它们继承自相同的“GeoData”接口。

我知道我可以通过这种方式在控制器中获得所需的dbset:

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并因此更改整个查询。 有没有办法利用从相同接口继承的所有表来获得更好的解决方法?

1 个答案:

答案 0 :(得分:0)

尝试显式定义DbSet类 喜欢

DbSet<Class> GeoContext = db.Set<Class>(type);

我猜你在代码的某处定义了这个类