Мне нужна функциональность, чтобы иметь дополнительные столбцы в определении LINQ to SQL. Так что LINQ to SQL обычно игнорирует этот столбец при выборе, обновлении и т. Д.
Но если выборка содержит значение для этого столбца, оно должно использовать это значение.
Длинная версия:
Сценарий
У меня есть следующие таблицы:
![alt text](https://i.stack.imgur.com/i1PhY.png)
Если 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 при обновлении.