【问题标题】:subquery in LINQ for UpdateLINQ 中用于更新的子查询
【发布时间】:2013-11-26 13:29:10
【问题描述】:

如何在 LINQ 中创建子查询?
查询看起来

UPDATE bikes SET name = @name, bike_type_id = @type, bike_type = (SELECT name FROM(SELECT name FROM type_bike WHERE id = @type) as tmp) WHERE id = @id

我正在努力

var obj = this.context.bikes.Single(x => x.id == id);
obj.name = name;
obj.bike_type = this.context.type_bike.Where(x=> x.id == typeBike).Select(q=> q.name).ToString();
obj.bike_type_id = typeBike;          
this.context.SubmitChanges();  

但它不起作用

【问题讨论】:

  • .Select(q=> q.name).FirstOrDefault().ToString();
  • “不起作用”不是一个充分的问题描述。发布您收到的任何错误消息,或您预期会发生的情况与实际发生的情况。
  • 如果name 是一个字符串,@AshokDamani ToString 是多余的。另外,如果FirstOrDefaultnull,你会得到一个不错的NullReferenceException

标签: c# asp.net linq asp.net-mvc-4


【解决方案1】:
var obj = this.context.bikes.SingleOrDefault(x => x.id == id);
// check if the obj is not null. 
if(obj!=null)
{
    obj.name = name;
    // I suppose that each bike has a unique type. Hence, I am not using the 
    // SingleOrDefault() and then checking if the result is null.
    obj.bike_type = this.context.type_bike
                        .Where(x=> x.id == id)
                        .Select(q=>q.name)
                        .Single();
    obj.bike_type_id = typeBike;          
    this.context.SubmitChanges(); 
}

我想在你的 obj.bike_type 赋值的 where 子句中,你没有使用正确的 id。

【讨论】:

    【解决方案2】:

    首先,您应该使用关系来获取诸如自行车类型之类的记录名称。在您的情况下,您不应该使用ToString(),因为它会返回 sql 语句。相反,您应该使用 FirstOrDefault()SingleOrDefault() 选择第一个找到的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 2018-05-26
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 2012-06-18
      相关资源
      最近更新 更多