Как я могу перенести результаты LINQ to SQL на внешнюю DLL? - PullRequest
1 голос
/ 08 октября 2009

До LINQ я хотел бы, чтобы мое основное приложение возвращало результаты SQL-запроса в набор данных. Затем я бы передал набор данных в качестве параметра для внешней библиотеки DLL. Теперь я передаю запрос LINQ to SQL, который возвращается как объект IQueryable (Of vClientTable). Я хочу иметь возможность перенести этот набор результатов vClientTable на мою внешнюю DLL, чтобы DLL могла работать с данными, включенными в результаты.

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

DB Query

Public Shared Function getClientData(ByVal clientID As Int32) As IQueryable(Of vClientTable)
Try
    Dim r = From p In dbLINQ.vClientTable _
       Where p.ltClientID = clientID _
       Order By p.cdCode _
       Select p
    Return r
Catch ex As Exception
    Return Nothing
End Try
End Function

App Sub, который получает данные через запрос к БД

Dim recordData As IQueryable(Of vClientTable) = getClientData(clientID)

Звонок на внешнюю библиотеку DLL

dataComplete = outputClientData(Now, recordData)

DLL sub

public static Boolean outputClientData(DateTime rptDate, IQueryable<vClientData> clientData)
    {
        //Do something with the data
        return true;
    }

Очевидно, что во внешней dll она не имеет представления о том, что такое объект IQueryable (vClientData), и даже если я создаю dbml-файл и datacontext в моем внешнем проекте для dll, который включает в себя тот же класс для таблицы БД / просмотрите его говорит, что объекты разных типов.

Есть идеи, как мне поступить с этим?

Спасибо

Ответы [ 3 ]

1 голос
/ 08 октября 2009

Я предполагаю, что как только вы дойдете до своего внешнего dll, у вашего IQueryable будет закрытый контекст, поэтому у вас сразу возникнет проблема. Если вы попытаетесь перечислить набор результатов, вы можете получить исключение, так как наиболее вероятно, что контекст уже удален. К вашему сведению, контекст - это в основном то, что связывает ваш IQueryable с вашей базой данных.

Что касается того, что возвращать, я бы предложил начать с возврата сначала IList вместо IQueryable. Вы можете сделать это, вызвав .ToList () на вашем IQueryable, и тогда у вас будет

IList<vClientData>

Это должно, по крайней мере, помочь вам начать изучение LINQ. Изучение того, как правильно использовать конструкцию IQueryable, потребует некоторой практики и изучения, но отправка результата, изложенного в IList или массиве, должна помочь вам в этом.

1 голос
/ 08 октября 2009

Моя первая реакция здесь будет состоять в том, чтобы абстрагировать слой доступа к данным в его собственную сборку и дать ссылки на него как вашему приложению, так и вашей DLL. Это позволит вам ссылаться на класс vClientData в обоих случаях, поскольку это только то, что вам нужно предоставить.

1 голос
/ 08 октября 2009

Может ли внешняя DLL ссылаться на сборку с сущностями в них? Затем вы можете вернуть любую коллекцию / набор / любой из ваших типов. Это простейшее использование.

Однако я бы не стал показывать IQueryable<T> в API, так как очень сложно гарантировать полную поддержку всех операций, и трудно гарантировать, что вызывающая сторона не сломает ваш DAL (случайно или преднамеренно). ); Я хотел бы иметь дискретные операции, которые возвращают известные конструкции, такие как List<T>, T[] и т. Д.

Если вы не можете добавить ссылку, то другие опции включают в себя:

  • сериализация (это, по сути, то, как WCF передает такие объекты; просто включите сериализацию на поверхности конструктора и используйте DataContractSerializer; вам потребуется соответствующий контракт данных на другом конце, но он не должен быть одного типа)
  • перевод в известный тип, такой как DataTable - немного как это и это , хотя я не действительно фанат DataTable
  • выставьте его как object и используйте отражение (хо-хум)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...