C #, LINQ, SQL: составные столбцы - PullRequest
       3

C #, LINQ, SQL: составные столбцы

3 голосов
/ 21 сентября 2009

У меня есть объект LINQ, для которого мне нужно создать специальное строковое значение. Это 7 разных значений, разделенных "-". Некоторые из используемых полей находятся в этой таблице, в то время как некоторые из них находятся в разных таблицах. Я хотел бы как-то добавить это поле к сущности, чтобы мне не приходилось создавать эту строку каждый раз, когда мне это нужно.

Я думал, что могу добавить его к сущности с частичным классом, подобным этому:

    public string SpecialField
    {
        get
        {
            return string.Format("{0}-{1}-{2}-{3}-{4}-{5}-{6}",
                                 TableId,
                                 Number,
                                 ForeignTableA.Date,
                                 ForeignTableB.Name,
                                 ForeignTableC.ForeignTableD.Name,
                                 ForeignTableB.ForeignTableE.Name,
                                 ForeignTableB.Number ?? 0);
        }
    }

Однако, написав это, я стал немного неуверенным, как это будет работать. Потому что, если я не ошибаюсь, это приведет к запросу базы данных каждый раз, когда это значение используется для каждого элемента. И сработает ли, например, использование этого поля в предложении Where?

Мне нужно использовать это поле в предложении Where, и я бы хотел, чтобы это происходило на сервере, чтобы я не получал больше данных, чем мне нужно.

Как бы вы лучше всего это сделали?

Ответы [ 3 ]

2 голосов
/ 21 сентября 2009

Вы можете создать представление в базе данных для этого для вас. Таким образом, SQL Server позаботится об этом, и вы сможете запросить его более эффективно

1 голос
/ 21 сентября 2009

Я думаю, вам понадобится предложение let с чертой анонимных типов. Я не проверял это, но что-то вроде этого может помочь:

var query = from master in MasterTable
            join foreignA in ForeignTableA on ...
            join foreignB in ForeignTableB on ...
            let special = string.Format ("...", master.TableID, ...)
            where special.Contains ("foo")
            select { 
                 // ...
                 string specialResult = special,
                 // ...
            }
0 голосов
/ 21 сентября 2009

Как насчет кэширования значения после того, как вы прочитали его один раз? Это не будет сверхэффективно, как если бы вы получили все эти значения одновременно, но это предотвратит множество попыток получить одно и то же значение. (Конечно, это работает, только если содержимое SpecialField не изменяется во время использования.)

protected string specialField = null;

public string SpecialField
{
    get
    {
        if (specialField == null)
        {
            specialField = string.Format("{0}-{1}-{2}-{3}-{4}-{5}-{6}",
                             TableId,
                             Number,
                             ForeignTableA.Date,
                             ForeignTableB.Name,
                             ForeignTableC.ForeignTableD.Name,
                             ForeignTableB.ForeignTableE.Name,
                             ForeignTableB.Number ?? 0);
        }
        return specialField;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...