Получение таблицы linq для динамической отправки в метод - PullRequest
1 голос
/ 11 июня 2009

У меня есть процедура:

var Edit = (from R in Linq.Products
            where R.ID == RecordID
            select R).Single();

Я бы хотел сделать Linq.Products динамическим. Что-то вроде:

protected void Page_Load(object sender, EventArgs e)
{
    something(Linq.Products);
}

public void something(Object MyObject)
{
    System.Data.Linq.Table<Product> Dynamic =
        (System.Data.Linq.Table<Product>)MyObject;
    var Edit = (from R in Dynamic
                where R.ID == RecordID
                select R).Single();   

Моя проблема в том, что метод "что-то" не сможет узнать, какая таблица была ему отправлена. Таким образом, статическая строка: System.Data.Linq.Table<Product> Dynamic = (System.Data.Linq.Table<Product>)MyObject; должна отражать что-то вроде: System.Data.Linq.Table<T> Dynamic = (System.Data.Linq.Table<T>)MyObject;

Поскольку <T> - это динамическая переменная перехвата всех, так что Linq может просто выполнить код так же, как я его кодировал вручную. Я выдернул свои волосы с этим. Пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 13 июня 2009

Я ссылаюсь на ответ Роберта Харви и ваш комментарий: «Нужно ли мне наследовать что-то особенное, чтобы решение работало?»

Да, поскольку вы используете универсальный тип (T), вам нужно ограничить универсальный тип чем-то, иначе T может быть чем угодно (object, int, string, Products и т. Д.), И что угодно может иметь разные свойства.

Таким образом, в идеале было бы иметь базовый тип или интерфейс, т.е.

pulbic interface IEntity
{
  Object Id { set; get; }
}

Итак, ваш табличный объект (сущность) должен наследоваться от IEntity, и тогда ваш код будет выглядеть так:

protected void Page_Load(object sender, EventArgs e)
{
    something(Linq.AnotherTable);
}

public void something<T>(System.Data.Linq.Table<T> MyObject)
  where T : IEntity
{
    var Edit = (from R in MyObject
                where R.ID == RecordID
                select R).Single();
}

Метод "что-то" выведет для вас T, если таблица AnotherTable наследуется от IEntity.

Следующая проблема заключается в том, что «Id» относится к типу object или к какому-либо другому типу, который вы хотели бы видеть, но это фиксированный тип. Итак, у вас снова проблема, что делать, если у вас есть разные типы идентификаторов? Поэтому вместо объекта или любого другого объекта, который вы указали (например, int, string, Guid), вы можете использовать «Ключ» в качестве свойства с универсальным типом, и возможное решение будет следующим:

pulbic interface IEntity<TKey>
{
  TKey Key { set; get; }
}

Это становится более гибким, но еще более усложняет ситуацию ...

0 голосов
/ 11 июня 2009

У меня нет интегрированного кода, потому что сейчас я работаю над концепцией. Это будет работать:

    protected void Page_Load(object sender, EventArgs e)
    {
        something(Linq.Products);
    }

    public void something(Object MyObject)
    {
        System.Data.Linq.Table<Product> Dynamic = (System.Data.Linq.Table<Product>)MyObject;
        var Edit = (from R in Dynamic
                    where R.ID == RecordID
                    select R).Single();

    }

Это не будет:

    protected void Page_Load(object sender, EventArgs e)
    {
        something(Linq.AnotherTable);
    }

    public void something(Object MyObject)
    {
        System.Data.Linq.Table<Product> Dynamic = (System.Data.Linq.Table<Product>)MyObject;
        var Edit = (from R in Dynamic
                    where R.ID == RecordID
                    select R).Single();

    }

Это будет работать:

    protected void Page_Load(object sender, EventArgs e)
    {
        something(Linq.AnotherTable);
    }

    public void something(Object MyObject)
    {
        System.Data.Linq.Table<AnotherTable> Dynamic = (System.Data.Linq.Table<AnotherTable>)MyObject;
        var Edit = (from R in Dynamic
                    where R.ID == RecordID
                    select R).Single();

    }

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

0 голосов
/ 11 июня 2009

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

    public void something<T>(T MyObject)
    {
        System.Data.Linq.Table<T> Dynamic = (System.Data.Linq.Table<T>)MyObject;
        var Edit = (from R in Dynamic
                    where R.ID == RecordID
                    select R).Single();

    }

Теперь вы можете назвать это так:

something<Product>(Linq.Products);

или так:

something<AnotherTableType>(Linq.AnotherTable);
0 голосов
/ 11 июня 2009

Ваш код не имеет особого смысла. Вы пытаетесь получить «что-то» или отправить методом «что-то»?

Можете ли вы опубликовать часть реального кода, чтобы он имел больше смысла?

...