Внутренние соединения с использованием LLBLGen? - PullRequest
1 голос
/ 01 июля 2010

Как я могу сделать простое соединение, используя LLBLGen?

table1 - clientTable (адрес, телефон и т. Д.) Table2 - employeeTable (имя и т. Д.) Table3 - clientEmployeeTable (clientid, employeeid)

Я заполняю сетку данных с использованием employeeId с полямидля информации о клиенте (адрес, телефон и т. д.), и я не уверен, как я мог получить это с помощью LLBLGen.Я полагаю, я мог бы создать хранимую процедуру, но, может быть, есть более простой способ?

Я полностью новичок в LLBLGen.

Тем временем я использовал хранимые процедуры, но, может быть, есть и лучший способ.

// in stored proc

SELECT (my specific fields)
FROM [client].[List] abl
    INNER JOIN [client].ClientGroup cg ON cg.ClientGroupId = abl.ClientGroupId


// in code 
DataTable dt=RetrievalProcedures.GetEmployeeNote(EmployeeId);
rgridNotes.DataSource = dt;

Ответы [ 3 ]

1 голос
/ 09 октября 2010

Добро пожаловать в LLBLGen! Отличный продукт, как только вы учитесь. Один из способов получения информации из множества объединенных таблиц - это типизированный список вашего собственного дизайна.

Ваши "мои конкретные поля" определены в ResultsetFields. Ваше предложение WHERE определяется с помощью выражения IPredicateExpression. Ваши предложения JOIN блестяще обрабатываются IRelationCollection и свойствами .Relations каждого объекта.

При попытке ускориться запуск профилировщика SQL Server (при условии, что вы используете MSSQL) является ключевым для того, чтобы увидеть, как изменения вашего кода в LLBLGen влияют на фактический SQL, запрашиваемый с сервера. Управление всеми () в предложениях JOIN и WHERE иногда требует тщательного упорядочения, но большую часть времени работает с первой попытки. Вот общий фрагмент, который мы используем:

private static DataTable GetTheGoodsOnEmployeeClients()
{
  // Define the fields that you want in your result DataTable
  ResultsetFields fields = new ResultsetFields(2);
  fields.DefineField(MyEntityFields.FieldName1, 0);
  fields.DefineField(MyEntityFields.FieldName2, 1, "Field Name Alias");

  // Add the WHERE clause to the query - "Condition" can be a literal or a variable passed into this method
  IPredicateExpression filter = new PredicateExpression();
  filter.Add(MyEntityFields.FieldName == "Condition");

  // Add all JOIN clauses to the relation collection
  IRelationCollection relations = new RelationCollection();
  relations.Add(MyEntity.Relations.FKRelationship);
  relations.Add(MyEntity.Relations.FKRelationship, JoinHint.Left);

  ISortExpression sort = new SortExpression();
  sort.Add(MyEntityFields.FieldName | SortOperator.Ascending);

  // Create the DataTable, DAO and fill the DataTable with the above query definition/parameters
  DataTable dt = new DataTable();
  TypedListDAO dao = new TypedListDAO();
  dao.GetMultiAsDataTable(fields, dt, 0, sort, filter, relations, false, null, null, 0, 0);

  return dt;
}        

Ваша конкретная потребность:

SELECT (my specific fields)
FROM [client].[List] abl
    INNER JOIN [client].ClientGroup cg ON cg.ClientGroupId = abl.ClientGroupId

Таким образом, станет:

private static DataTable GetTheGoodsOnEmployeeClients()
{
  // Define the fields that you want in your result DataTable
  ResultsetFields fields = new ResultsetFields(3);
  fields.DefineField(ClientFields.ClientId, 0);
  fields.DefineField(ClientFields.ClientName, 1, "Client");
  fields.DefineField(ClientGroupFields.ClientGroupName, 2, "Group");

  // Add all JOIN clauses to the relation collection
  IRelationCollection relations = new RelationCollection();
  relations.Add(ClientEntity.Relations.ClientGroupEntityUsingClientGroupId);

  // Create the DataTable, DAO and fill the DataTable with the above query definition/parameters
  DataTable dt = new DataTable();
  TypedListDAO dao = new TypedListDAO();
  dao.GetMultiAsDataTable(fields, dt, 0, null, null, relations, false, null, null, 0, 0);

  return dt;
}        

Хотя этот кажется подобным большому количеству кода для выполнения чего-то базового, код почти сам записывается, как только вы к нему привыкли, и значительно быстрее, чем написание сантехники. Ты никогда не вернешься.

0 голосов
/ 05 марта 2018
Use LinqMetaData

LinqMetaData metaData = new LinqMetaData();

if you use adapter mode

LinqMetaData metaData = new LinqMetaData(adapter);

var result = from a in metaData.TableA
               join b in metaData.TableB on a.Key equals b.Key
             where a.OtherField == value
             select a;
0 голосов
/ 02 июля 2010

Возможно, вы хотите создать несколько «полей в связанных полях». Вы можете добавить свойства ClientGroup к объекту Client для прозрачного доступа к ним. Это работает только для непосредственно связанных полей в соотношении (m: 1). Если вы хотите присоединиться глубже, вы должны использовать типизированные списки.

Когда вы выбираете объекты и хотите присоединиться из-за оператора where, вы можете использовать отношения для объединения таблиц и построения предиката.

Привет

...