如何在Linq to SQL中编写不等运算符?

12
using (RapidWorkflowDataContext context = new RapidWorkflowDataContext())
                    {
                        var query = from w in context.WorkflowInstances
                        from c in context.Workflows 
                         where EmpWorkflowIDs.Contains((int)w.ID) && w.CurrentStateID != c.LastStateID
                         select w;

                        return query.ToList();
                    }

我有2个表:工作流和工作流实例。

工作流用于存储对象,工作流实例用于存储实例。

工作流表:ID,名称,第一个状态ID,最后一个状态ID

工作流实例表:ID,名称,工作流ID,当前状态ID

如何在linq to sql中编写查询以从WorkflowInstances中选择当前状态ID不等于最后状态ID的实例。


3
你的查询有什么问题? - Kamil Budziewski
1
你似乎在linq中写了一个不等于运算符。你具体遇到了什么问题? - Chris
我在使用linq to sql时对于如何连接两个表感到困惑,因为我是新手 :/ - Anas Salem
3个回答

14

你需要修改连接语句,使其基于两个表之间的相关列,然后在where子句中添加条件,像下面这样:

using (RapidWorkflowDataContext context = new RapidWorkflowDataContext())
                        {
                            var query = from w in context.WorkflowInstances
                                        join c in context.Workflows on w.WorkflowID equals c.ID
                                         where EmpWorkflowIDs.Contains((int)w.ID)
                                         && w.CurrentStateID != c.LastStateID
                                         select w;

                            return query.ToList();
                        }

7
如果您使用Lambda表达式,则not(!)放在那里:
.Where(p => !p.Whatever...)

1
这应该是正确的答案,因为这里的所有其他解决方案都无法处理复杂的查询。当我第一次阅读这个答案时,我不知道@erkaner想说什么,但事实证明很简单:from a in b join c in d into e from f in e.Where(....) - ViRuSTriNiTy

0

您可以消除join,并且它应该是这样的:

var query = from w in context.WorkflowInstances
            where !context.Workflows.Any(c => w.CurrentStateID != c.LastStateID) && EmpWorkflowIDs.Contains((int)w.ID)
            select w;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接