【问题标题】:Struggling with Lambda expression (VB .net)与 Lambda 表达式作斗争(VB .net)
【发布时间】:2012-04-23 17:00:41
【问题描述】:

我有一个相对简单的事情,我可以在 SQL 中轻松完成,但我正在尝试习惯使用 Lambda 表达式,并且很难。

这是一个简单的例子。基本上我有2张桌子。

  • tblAction (ActionID, ActionName)
  • tblAudit(AuditID、ActionID、已删除)

tblAudit 可能有一个关于 tblAction 的条目,其中 Deleted 标志设置为 1。

我要做的就是选择在 tblAudit 中没有已删除条目的操作。所以SQL语句是:

Select tblAction.* 
From tblAction LEFT JOIN tblAudit on tblAction.ActionID=tblAudit.ActionID
where tblAudit.Deleted <> 1

在 VB.Net 的 LINQ 中与上述内容等效的是什么?我试过了:

Context.Actions.Where(Function(act) Context.Audit
.Where(Function(aud) aud.Deleted=False AndAlso aud.ActionID=act.ActionID)).ToList

但这实际上是一个内部连接类型的场景,它要求 tblAction 中的每个条目在 tblAudit 中也有一个条目。我正在使用 Entity Framework Code First 来进行数据库映射。有没有办法以您可以做到这一点的方式定义映射?

【问题讨论】:

  • 我不清楚 lambda 表达式与此有什么关系。也许你的意思是Linq?
  • Razi,请查看LINQPad 和101 LINQ Samples in VB。
  • Group Join 将做外部连接。还有一个导航属性 (Action.Audits)。

标签: entity-framework lambda left-join code-first linq-expressions


【解决方案1】:

你应该添加

Public Property Audits As DbSet&lt;Audit&gt;

进入您的操作实体类(以注册这些表之间的关联)。

现在你可以写下你的意思了:

(From act in Context.Actions Where Not act.Audits.Any(Function(audit) audit.Deleted)).ToArray

相当于

Context.Actions.Where(Function(act) Not act.Audits.Any(Function(audit) audit.Deleted)).ToArray

让 LINQ 解析器完成繁重的 SQL 工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多