Linq to SQL - Не извлекать определенный столбец
Есть ли способ не получить конкретный столбец с помощью linqtosql без использования анонимного типа и указать каждый возвращенный файл отдельно?
Мы используем SQLMetal для генерации файла dbml, который содержит все типы, в которые можно отправить результаты запроса. Однако, когда столбцы выбора включены в запрос linq, результаты переходят в анонимный тип, а не тип, объявленный в файле dbml. Я хотел бы выбрать все, кроме одного из столбцов из конкретной таблицы, но все же есть результаты, возвращенные в соответствующем типе dbml.
Любые идеи оценены.
Ответы
Ответ 1
Спасибо всем за ваш вклад. Окончательное решение, на котором я остановился, это просто указать столбцы, которые я хочу вернуть, но для этого в инструкции Linq в новом объекте типа, который я хочу... пример должен помочь!:
Журнал таблицы содержит три столбца
- LogID
- DateLogged
- SerializedDatali >
Но мне нужны только данные 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 исключать столбцы, поскольку прямая проекция вернет все.