Linq to SQL - не извлекать конкретный столбец - PullRequest
17 голосов
/ 12 мая 2009

Есть ли способ , а не извлекать определенный столбец с помощью linqtosql без необходимости использовать анонимный тип и указывать каждый возвращаемый файл отдельно?

Мы используем SQLMetal для генерации dbml-файла, который содержит все типы, в которые помещаются запрашиваемые данные. Однако когда столбцы select включены в запрос linq, результаты переходят в анонимный тип вместо типа, объявленного в файле dbml. Я хотел бы выбрать все столбцы из определенной таблицы, кроме одного , но результаты все равно возвращались в связанном типе dbml.

Любые идеи приветствуются.

Ответы [ 5 ]

18 голосов
/ 12 мая 2009

LINQ to SQL поддерживает отложенная загрузка отдельные свойства. В конструкторе DBML вы можете установить Delay Loaded в true в свойствах столбца. Столбцы, которые загружены с задержкой, не будут включены в начальные значения SELECT. Если вы попытаетесь получить доступ к свойству объекта, и он еще не был загружен, то будет выполнен другой оператор SELECT, чтобы вывести это значение из БД.

Если вы редактируете файл DBML вручную, установите <Column IsDelayLoaded="true">. Если вы пишете свои классы LINQ to SQL вручную, это так же просто, как объявление поля поддержки свойства как Link<T> вместо T. Например:

[Table]
public class Person
{
    private Link<string> _name;

    [Column(Storage = "_name")]
    public string Name
    {
        get { return _name.Value; }
        set { _name.Value = value; }
    }
}

См. Также раздел «Задержка / отложенная загрузка» в этой публикации Скотта Гатри .


Обновление: приведенный выше ответ применяется, если вы хотите, чтобы столбец оставался доступным, когда вам это нужно. Он не будет включен в SELECT с, если вы не попросите об этом (см. LoadOptions) или не попытаетесь получить к нему доступ.

Если вы просто не хотите использовать или получать доступ к столбцу вообще, и вы не хотите, чтобы он был доступен как свойство класса, тогда перейдите к ответу Serapth об удалении столбца из DBML файл. Убедитесь, что вы понимаете последствия, такие как проверка потери параллелизма в этом столбце.

4 голосов
/ 12 мая 2009

Если вы очень ленивы, почему бы не добавить таблицу во второй раз с помощью DBML-конструктора, переименовать ее в MyTableWithOutColumnX, а затем удалить запись, которую вы не хотите возвращать? Просто выделите имя столбца и нажмите «Удалить».

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

1 голос
/ 06 мая 2011

Посмотрите на по этой ссылке пример того, как включить отложенную загрузку столбцов с помощью SQLMetal.

В основном он использует XSLT для последующей обработки сгенерированного файла для преобразования типа столбца из X в Link<X> (оба типа из System.Data.Linq namesapce)

1 голос
/ 12 мая 2009

Спасибо всем за ваш вклад. Последнее решение, на котором я остановился, - это просто указать столбцы, которые я хочу вернуть, НО, чтобы сделать это в операторе Linq, в новом объекте нужного мне типа ... пример должен помочь!:

Таблица журнала имеет три столбца

  • LogID
  • DateLogged
  • SerializedData

Но мне нужны только данные DateLogged & Serialized. Однако мне бы хотелось, чтобы в содержал контейнер данных, сгенерированный SQLMetal

Я достиг этого с помощью следующего утверждения:


Dim q = Из logItem В dc.Log Выбрать новый журнал с {.LogID = logItem.LogID, .DateLogged = logItem.DateLogged}


Надеюсь, это поможет кому-то еще!

0 голосов
/ 12 мая 2009

Способ, которым LINQ to SQL знает, какие столбцы нужно включить, определяется анонимным типом, который вы проецируете на запрос. Я не думаю, что есть какой-то другой способ, чтобы LINQ to SQL исключал столбцы, поскольку прямая проекция вернет все.

...