0

我有一個相對簡單的事情,我可以在SQL中輕鬆完成,但我試圖習慣使用Lambda表達式,並且很難。用Lambda表達式掙扎(VB .net)

這是一個簡單的例子。基本上我有2張桌子。

  • tblAction(ActionID,ActionName)
  • tblAudit(AuditID,ActionID,刪除)

tblAudit可能設置爲1

所有我刪除標誌的條目關於tblAction想要做的是選擇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一個條目。我首先使用實體​​框架代碼來執行數據庫映射。有沒有一種方法可以用這種方式定義映射?

+0

我不清楚什麼lambda表達式與此有關。也許你的意思是[Linq?](http://msdn.microsoft.com/zh-cn/vstudio/bb688088) – 2012-04-23 17:03:33

+2

Razi,請查看[LINQPad](http://www.linqpad.net/)和[101 LINQ VB中的示例](http://msdn.microsoft.com/zh-cn/vstudio/bb688088)。 – 2012-04-23 18:32:39

+0

Group Join將執行外連接。導航屬性(Action.Audits)也是如此。 – 2012-04-25 06:59:33

回答

1

您應該添加

Public Property Audits As DbSet<Audit>

到動作的實體類(註冊這些表之間的關聯)。

現在你可以只寫你的意思:

(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工作。