Как я могу установить значение для объекта Linq во время запроса? - PullRequest
3 голосов
/ 16 февраля 2010

У меня есть простой запрос, как показано ниже

var trips = from t in ctx.Trips
            select t;

Проблема в том, что у меня есть дополнительное свойство для объекта Trip, которое необходимо назначить, желательно без итерации возвращаемого IQueryable.

Кто-нибудь знает, как установить значение во время запроса? (т.е. выберите t, t.property = "value")

Ответы [ 3 ]

6 голосов
/ 16 февраля 2010

Прежде всего, если вы никогда не просматриваете результаты, ваш код не запустится. LINQ является «ленивым», что означает, что он вычисляет следующий результат только тогда, когда вы запрашиваете его.

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

Trip SetProperty(Trip t)
{
    t.property = "value";
    return t;
}
var trips = from t in ctx.Trips select SetProperty(t);
1 голос
/ 16 февраля 2010

Это будет работать:

var trips = from t in ctx.Trips select new Trip 
{
    // db properties
    t.ID,
    t.Name,
    t.Description,

    // non-db properties
    SomeValue = 45,
    SomeOtherValue = GetValueFromSomewhereInCode(t.ID)
}

Проецируя строки базы данных в «новые» объекты Trip, вы можете установить свойства, которые не заполняются LINQ to SQL, без необходимости в дополнительном перечислении. Вы также можете вызывать пользовательский код в своей проекции, потому что он выполняется в коде, а не как часть оператора SQL, отправляемого в базу данных.

Однако полученные объекты Trip не включены для отслеживания изменений, поэтому имейте это в виду (вы не можете вносить изменения в свойства и автоматически обновлять их с помощью SubmitChanges(), поскольку контекст данных не знает о Trip объектов).

Если вам также необходимо отслеживать изменения, вам нужно будет снова перечислить отслеживаемые объекты Trip после того, как вы получили их через LINQ to SQL. На самом деле это не проблема, так как это должна быть итерация в памяти.

0 голосов
/ 16 февраля 2010

Если вы не хотите выполнять итерацию последовательности командировок, лучше обновить базу данных напрямую, используя хранимую процедуру или параметризованный запрос.

Если вы беспокоитесь, что последовательность Trips будет содержать слишком много элементов и будет обрабатываться медленно, вы, конечно, можете добавить больше фильтрации в предложении where.

Если это невозможно, это просто еще одна причина для обработки очень больших наборов результатов в базе данных с использованием сохраненного процесса и т. Д.

В противном случае обычный подход LINQ to SQL выглядит примерно так:

using (var context = new DefaultDataContext())
{
    var defects = context.Defects.Where(d => d.Status==Status.Open);             

    foreach(Defect d in defects)
    {
        defect.Status = Status.Fixed;                     
        defect.LastModified = DateTime.Now;
    }
    context.SubmitChanges();                 
}
...