LINQ to SQL необязательный столбец - PullRequest
1 голос
/ 16 ноября 2009

Мне нужна функциональность, чтобы иметь дополнительные столбцы в определении LINQ to SQL. Так что LINQ to SQL обычно игнорирует этот столбец при выборе, обновлении и т. Д. Но если выборка содержит значение для этого столбца, оно должно использовать это значение.

Длинная версия:

Сценарий

У меня есть следующие таблицы:
alt text

Если Field.FieldViews.Count () больше 0, чем должно быть видно это поле.

Проблема

Если я проверяю видимость, как указано выше, с помощью:

Field.FieldViews.Count()

Чем он делает один запрос к базе данных для каждого поля. Так что в моем проекте иногда до 1000х

Мое решение

Я написал хранимую процедуру:

 SELECT
   f.*,
   (SELECT COUNT(*) FROM [fieldViews] v WHERE v.fieldId = f.fieldId) AS Visible
  FROM [fields] f
  WHERE
   f.X BETWEEN @xFrom AND @xTo AND
   f.Y BETWEEN @yFrom AND @yTo

Чтобы использовать этот дополнительный столбец, я добавил следующий код:

 public partial class Field
  {
   private bool visible = false;

   [Column(Storage = "Visible", DbType = "INT")]
   public bool Visible
   {
    get
    {
     return visible;
    }
    set
    {
     visible = value;
    }
   }
  }

Это прекрасно работает.

Но ...

Проблема

Если я получаю записи из таблицы полей без хранимой процедуры:

from d in DataContext.Fields select d;

Я получил следующую ошибку:

Bad Storage property: 'Visible' on member 'Models.Field.Visible'.

Итак, я добавил столбец «Видимый» в таблицу базы данных:

ALTER TABLE dbo.Fields ADD
 Visible int NOT NULL CONSTRAINT DF_Fields_Visible DEFAULT 0

С этим я мог бы исправить ошибку, упомянутую выше.

Но & hellip;

Следующая проблема

Я извлек некоторые объекты Field с помощью хранимой процедуры. Теперь я внесу некоторые изменения в некоторые из этих объектов. Если я сейчас попытаюсь отправить эти изменения, это не сработает. Глядя на сгенерированный запрос раскрывает причину:

 UPDATE [dbo].[Fields]
 SET [X] = @p3
 WHERE ([FieldId] = @p0) AND ([X] = @p1) AND ([Y] = @p2) AND ([Visible] = 3)

Проблема здесь в том, что он использует столбец "Visible" в операторе where. Но столбец «Видимый» всегда равен 0. Visible только больше 0, если я получаю данные, используя хранимую процедуру ...

Что мне нужно

Что-то вроде атрибута Column, где столбец не требуется

или

способ удаления столбца из оператора where при обновлении.

Ответы [ 3 ]

2 голосов
/ 16 ноября 2009

Мы решили исходную проблему, запросив таблицу подробностей, что-то вроде:

FieldViewsRepository.FieldViews.Where(fv => fv.FieldViewId == Field.FieldID).Count()

Генерирует только один запрос к базе данных.

Если вам нужен список объектов с дополнительным свойством Visible, вы можете сделать что-то вроде этого:

FieldRepository.Fields.Select(f => new { ID=f.FieldID, X=f.X, y=f.Y, Visible=f.FieldViews.Any() }

или

FieldRepository.Fields.Select(f => new { Field=f, Visible=f.FieldViews.Any() }

В отличие от случая, когда Visible является свойством объекта Filed и выполняет запрос для каждого поля, в этом случае поля и свойство Visible выбираются одним запросом из базы данных.

1 голос
/ 16 ноября 2009

Нет необходимости хранить это как столбец в таблице полей - вы можете рассчитать это в классе поля:

public bool Visible
{
    get { return this.FieldViews.Count() > 0; }
}
0 голосов
/ 17 ноября 2009

Я нашел решение, которое решает мою проблему:

        private bool visible = false;
    public bool Visible
    {
        get
        {
            return visible;
        }
        set
        {
            visible = value;
        }
    }

    private int fakeVisible
    {
        get
        {
            return 0;
        }
        set
        {
            visible = value > 0;
        }
    }

    [Column(Name="Visible", Storage = "fakeVisible", DbType = "Int NOT NULL")]
    public int FakeVisible { get; set; }

Спасибо в любом случае!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...