【问题标题】:insert from linq to sql with join使用连接从 linq 插入到 sql
【发布时间】:2013-04-25 20:20:51
【问题描述】:

我有以下问题

var listOfFollowers = (from a in db.UserLinks
        where a.TargetUserID == TargetUserID && a.LinkStatusTypeID == 2 
        join b in db.UserNotifications on (int)a.OriginUserID equals b.TargetUserID
        select b);

然后我想在返回的每一行(或对象)上更新一次列

 foreach (var a in listOfFollowers)
    {
      a.UserNotifications += HappeningID.ToString() + "|";
    }
    db.SubmitChanges();

查询似乎可以工作,当我将生成的 SQL 放入 SSMS 时它工作正常,但是当我运行整个代码时,我尝试强制转换为 int 时遇到异常,这没有太大意义。

这样可以吗,使用 join 进行查询,但只返回一个表,更改一个属性,然后提交更改?

【问题讨论】:

  • @ShafqatMasood - 没有运气
  • 试试这个 var listOfFollowers = (from a in db.UserLinks where a.TargetUserID == TargetUserID && a.LinkStatusTypeID == 2 join b in db.UserNotifications on a.OriginUserID 等于 SqlFunctions.StringConvert(( double)b​​.TargetUserID) 选择 b);

标签: c# linq linq-to-sql


【解决方案1】:

您得到 can't cast 异常的原因是在 LINQ 语句中进行强制转换是无效的。我们不能做的其他事情是使用常规方法调用,例如 toString()

(int)a.OriginUserID 不允许在

中使用
   var listOfFollowers = (from a in db.UserLinks
    where a.TargetUserID == TargetUserID && a.LinkStatusTypeID == 2 
    join b in db.UserNotifications on (int)a.OriginUserID equals b.TargetUserID
    select b);

这个问题会发生,因为解析器试图将它转换成等效的 SQL 但没有找到任何等效的。其他此类情况是当您尝试调用 toString() 时。这里有几个很好的回应: linq-to-entities-does-not-recognize-the-method

对于您当前的情况,我相信您必须 1. 从第一个查询中获取结果 2. 铸造价值 3. 进行第二个 LINQ 查询

希望这会有所帮助!

【讨论】:

  • 我没有使用 ToString() ,似乎比较两个数字效率低下,但正是转换为 int 引发了异常,我更改了 db 以使两个列都变为 bigint一个 int 和一个 bigint
  • 你对不当演员的看法是正确的,所以你得到了我的接受和赞成,但先做一个查询,然后做演员,然后另一个查询是最有效的方法。
  • @Scott。演员绝对是你的问题。我的意思是说还有一些我们不能在 LINQ 语句中做的事情,比如使用诸如“toString()”之类的方法。我已经稍微编辑了我的答案以使其清楚。
【解决方案2】:

很可能,这段代码出现问题(int)a.OriginUserID
尝试移除强制转换或使用SqlFunctions.StringConvert() 来比较字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多