我有一个简单的查询,如下所示
var trips = from t in ctx.Trips
select t;
问题是我在Trip对象上有一个额外的属性需要分配,最好不要遍历返回的IQueryable
。
有谁知道如何在查询期间设置值? (即选择t,t.property =“value”)
答案 0 :(得分:6)
首先,如果您从不迭代结果,您的代码将无法运行。 LINQ是“懒惰的”,这意味着它只会在您要求时计算下一个结果。
但是,如果你真的需要做你要求的事情,试试这样的事情:
Trip SetProperty(Trip t)
{
t.property = "value";
return t;
}
var trips = from t in ctx.Trips select SetProperty(t);
答案 1 :(得分:1)
这样可行:
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)
}
通过将数据库行投影到“new”Trip对象中,您可以设置LINQ to SQL未填充的属性,而无需任何其他枚举。您还可以在投影中调用自定义代码,因为它在代码中执行,而不是作为发送到数据库的SQL语句的一部分。
但是,生成的Trip对象未启用更改跟踪,因此请记住(您无法对属性进行更改并通过SubmitChanges()
自动更新它们,因为数据上下文不知道关于你的Trip
个对象。
如果您还需要跟踪更改,则需要在通过LINQ to SQL检索后再次枚举跟踪的Trip对象。这不是一个真正的问题,因为它应该是内存中的迭代。
答案 2 :(得分:0)
如果您不想迭代Trips序列,最好使用存储过程或参数化查询直接更新数据库。
如果您担心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();
}