Приведение объектов, созданных в LINQ to SQL, к одному главному объекту - PullRequest
0 голосов
/ 13 июля 2010

У меня есть интересная проблема, которую нужно решить, если бы я успешно преобразовал объекты, созданные LINQ в SQL, в один главный объект, который я мог бы обойти.Вот сценарий на высоком уровне.

У меня есть несколько хранимых процедур, которые извлекают данные, а затем все возвращают одинаковые столбцы.Параметры в процессах и логика сильно различаются, поэтому один процесс не будет работать.Затем Linq создает строго типизированный объект, который используется в моем приложении в качестве параметров и возвращаемых значений.

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

В настоящее время я жестко программирую свои параметры, и если бы я мог создать главный объект, к которому я мог бы привести любой из этих объектов Linq,Затем я всегда мог передать и вернуть мастер-объект.

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

Какое общее направление я бы выбрал для решения этой проблемы преобразования строго типизированных объектов, сгенерированных linq, которые в точности совпадают, в один главный объект?

Спасибо за любые ваши мысли.

Ответы [ 2 ]

1 голос
/ 13 июля 2010

Если все ваши объекты linq имеют одинаковые поля, вы можете использовать их для реализации интерфейса, определенного этими общими полями.Тогда вызовы ваших методов фильтрации могут зависеть от интерфейса, а не от конкретной реализации.Другими словами, параметры в методах фильтра будут иметь тип интерфейса, а не тип класса linq.

Например: где ICommonFields - это интерфейс, который вы определяете со всеми общими полями в каждом классе l2s -

public class Filterer
{
     public ICommonFields filterStuff(ICommonFields x)
     {
       //do stuff
     }

}

или -

public class Filterer 
{
    public T filterStuff<T>(T x)
      where T: class, ICommonFields, new()
    {
        //do stuff
    }

}

Я бы предпочел универсальную версию, поскольку T становится фактическим типом, а не ссылкой через интерфейс - у linq-to-sql возникают проблемы при использованиивведите через интерфейс с выражениями запросов.

Редактировать: извините, было поздно, когда я впервые написал этот ответ (вероятно, извините! :).Исправлена ​​моя очевидная ошибка с примером кода:)

0 голосов
/ 13 июля 2010

Хотя может быть способ сделать это с помощью приведения, я собираюсь предложить вам быстрое и грязное решение - и я предполагаю, что ваши результирующие объекты основаны на коллекции:

Учитывая, что все ваши дочерние объекты имеют одни и те же столбцы, выберите один из них, который будет действовать как ваш главный объект, - затем просто переберите ряды других ваших объектов LINQ и добавьте их в коллекцию вашего главного объекта.Если ваш результирующий объект представляет собой строго типизированную таблицу данных, то все, что вам нужно сделать, это добавить в коллекцию .Rows.

Кроме того, вы можете просто добавить элементы, полученные после некоторых последующих запросов LINQ.непосредственно к вашему главному объекту, в зависимости от того, как вы пишете причины SELECT в LINQ.

...