Как извлечь эти данные LinqToSql в объект POCO? - PullRequest
0 голосов
/ 16 ноября 2009

с моими классами репозитория я использую LinqToSql для извлечения данных из репозитория (например, Sql Server 2008, в моем примере). Я помещаю данные результата в POCO объект. Прекрасно работает:)

Теперь, если у моего POCO объекта есть дочернее свойство (это другой объект POCO или IList), я пытаюсь найти способ заполнить эти данные. Я просто не уверен, как это сделать.

Вот пример кода, который у меня есть. Обратите внимание на последнее свойство, которое я устанавливаю. Он компилируется, но это не так. Это не экземпляр объекта POCO ... и я не уверен, как закодировать эту последнюю строку.

public IQueryable<GameFile> GetGameFiles(bool includeUserIdAccess)
{
    return (from q in Database.Files
            select new Core.GameFile
            {
                CheckedOn = q.CheckedOn.Value,
                FileName = q.FileName,
                GameFileId = q.FileId,
                GameType = (Core.GameType)q.GameTypeId,
                IsActive = q.IsActive,
                LastFilePosition = q.LastFilePosition.Value,
                UniqueName = q.UniqueName,
                UpdatedOn = q.UpdatedOn.Value,

                // Now any children....
                // NOTE: I wish to create a POCO object
                //        that has an int UserId _and_ a string Name.
                UserAccess = includeUserIdAccess ?
                    q.FileUserAccesses.Select(x => x.UserId).ToList() : null
            });
}

Примечания:

  • Database.Files => Таблица файлов.
  • Database.FilesUserAccess => таблица FilesUserAccess .. какие пользователи имеют доступ к таблице GameFiles / Files.

Обновление

Теперь у меня есть предложение извлечь результаты детей в их соответствующие POCO классы, но это то, что Visual Studio Debugger говорит, что класс: -

alt text

Почему это System.Data.Linq.SqlClient.Implementation.ObjectMaterializer<..>

.Convert<Core.GameFile>, а не List<Core.GameFile>, содержащий POCO's?

Есть предложения, что это такое / что я сделал не так?

Обновление 2:

это то, что я сделал, чтобы извлечь данные о детях в их соответствующие данные.

// Now any children....
UserIdAccess = includeUserIdAccess ? 
    (from x in q.FileUserAccesses
     select x.UserId).ToList() : null,
LogEntries = includeUserIdAccess ? 
    (from x in q.LogEntries
     select new Core.LogEntry
     {
         ClientGuid = x.ClientGuid,
         ClientIpAndPort = x.ClientIpAndPort,
         // ... snip other properties
         Violation = x.Violation
     }).ToList() : null

Ответы [ 2 ]

1 голос
/ 16 ноября 2009

Я думаю, что все, что вам нужно сделать, это разместить еще один запрос Linq здесь:

q.FileUserAccesses.Select(x => x.UserId).ToList()

т.е. Вы хотите выбрать данные из записей FileUserAccess - я предполагаю, что это классы Linq to SQL, поэтому для этого у вас может быть что-то вроде:

(from fua in q.FileUserAccesses
select new PocoType
{
   UserID = fua.UserID, 
   Name = fua.User.UserName // Not sure at this point where the name comes from
}).ToList()

Это должно, по крайней мере, указать вам правильное направление.

0 голосов
/ 16 ноября 2009

Какой тип UserIdAccess? Как это не «правильно»? Вы получаете «неправильные» данные? Если да, проверили ли вы свою базу данных напрямую, чтобы убедиться в наличии «правильных» данных?

...