Entity Framework - как объединить таблицы без LINQ и только с строкой?
У меня есть вопрос о Entity Framework. Пожалуйста, ответьте, если знаете ответ на этот вопрос. У меня есть такой запрос:
String queryRaw =
"SELECT " +
"p.ProductName AS ProductName " +
"FROM ProductEntities.Products AS p " +
"INNER JOIN CategoryEntities.Categories AS c " +
"ON p.CategoryID = c.CategoryID ";
ObjectQuery<DbDataRecord> query = new ObjectQuery<DbDataRecord>(queryRaw, entityContext);
GridView1.DataSource = query;
GridView1.DataBind();
В частности, я хочу объединить несколько таблиц в одном запросе, но я не могу использовать LINQ и не могу использовать ObjectQuery с объектами, сопоставленными с полями БД внутри моего запроса. Потому что каждая сущность создает динамически. Так что это то, что я не могу использовать:
msdn.microsoft.com/en-us/library/bb425822.aspx#linqtosql_topic12
msdn.microsoft.com/en-us/library/bb896339%28v=VS.90%29.aspx
Вопрос в том, могу ли я использовать что-то подобное вместо использования объектов?
query.Join ("INNER JOIN CategoryEntities.Category ON p.CategoryID = c.CategoryID ");
Цель состоит в том, чтобы использовать метод Join ObjectQuery с синтаксисом, как в методе Where:
msdn.microsoft.com/en-us/library/bb338811%28v=VS.90%29.aspx
Спасибо артем
2 ответа
Наконец, я нашел лучшее решение для этого, мы можем использовать Sub Query внутри основного Query. Например:
var db = CustomEntity();
ObjectQuery<Categories> query1 = db.Categories.Where("it.CategoryName='Demo'").Select ("it.CategoryID");
var categorySQL = query1.ToTraceString().Replace("dbo", "CustomEntity"); // E-SQL need this syntax
ObjectQuery<Products> query2 = db.Categories.Where("it.CategoryID = (" + categorySQL + ")");
Некоторый пример здесь:
http://msdn.microsoft.com/en-us/library/bb896238.aspx
Удачи!
Любое решение, которое я вижу сейчас, - временно преобразовать ObjectQuery в строку, добавить объединенную таблицу в виде строки и затем преобразовать ее обратно в ObjectQuery:
RoutesEntities routesModel = new RoutesEntities(entityConnection);
String queryRaw = "SELECT " +
"rs.RouteID AS RouteID, " +
"rs.LocaleID AS LocaleID, " +
"rs.IsSystem AS IsSystem " +
"FROM RoutesEntities.Routes AS rs ";
_queryData = new ObjectQuery<DbDataRecord>(queryRaw, routesModel);
var queryJoin = _queryData.CommandText + " INNER JOIN LocalesEntities.Locales AS ls ON ls.LocaleID = rs.LocaleID ";
_queryData = new ObjectQuery<DbDataRecord>(queryJoin, routesModel);
Может быть, у кого-то есть более последовательные предложения?