2013-07-12 46 views
0

我正在使用EF代碼。這裏是定義我的多對多關聯表兩類:實體框架如何與ASP.NET MVC中的lambda表達式一起工作

public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string Email { get; set; } 

    public virtual ICollection<Habit> Habits { get; set; } 
} 



public class Habit 
{ 
    [Key] 
    public int HabitId { get; set; } 

    public virtual ICollection<UserProfile> Users { get; set; } 
} 

我需要從我的數據庫選擇當前用戶的所有習慣。我對c#很陌生,問題是我無法理解如何使用複雜的lambda表達式。我試過了:

context.Habits.Where(habit => habit.Users 
       .Where(user=>user.Email==User.Identity.Name)).ToList() 

但是這是錯誤的。您能否糾正我的基於lambda的查詢。謝謝。

+1

user.Email == User.Identity 。名稱 ? – octref

回答

2

爲什麼不加一個DbSet<UserProfile>對上下文,然後做:

context.Users.Include("Habits") 
     .First(user => user.Email == User.Identity.Name) 
     .Habits; 

如果你想避免上面和相當固定的查詢,你應該做的:

context.Habits.Where(habit =>     
      habit.Users.Any(user=>user.Email==User.Identity.Name)).ToList(); 

Any的回報,如果屬實IEnumerable中的任何項都滿足條件。

0

嘗試使用選擇(或的SelectMany如果你想有一個單一的扁平列表)首次lambda表達式:

context.Habits.Select(habit => 
    habit.Users.Where(user => user.Email == User.Identity.Name) 
    ).ToList() 

的問題是,Where要求lambda表達式返回一個布爾值,並且它返回一個IEnumerable<UserProfile>

0

因爲要選擇UserProfile實體特定屬性(Habits)最直接的方法是在我看來,使用Select

var habits = context.UserProfiles 
    .Where(user => user.Email == User.Identity.Name) 
    .Select(user => user.Habits) 
    .SingleOrDefault(); // I assume here that the Email is unique