Подтвердить что ты не робот

Linq to SQL - Не извлекать определенный столбец

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

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

Любые идеи оценены.

4b9b3361

Ответ 1

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

Журнал таблицы содержит три столбца

  • LogID
  • DateLogged
  • SerializedData​​li >

Но мне нужны только данные DateLogged и Serialized. Тем не менее, я хотел бы, чтобы это было в datacontainer, сгенерированном SQLMetal

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


Dim q = From logItem В dc.Log Выберите Новый журнал с помощью. {.LogID = logItem.LogID,.DateLogged = logItem.DateLogged}


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

Ответ 2

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. Убедитесь, что вы понимаете последствия, такие как потеря concurrency проверки этого столбца.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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