2017-03-10 65 views
0

我想使用linq c#lambda表達式獲取兩個表合併數據,並獲取列表中列的固定編號。 我試過這段代碼,但我不知道如何在linq lambda表達式中寫入查詢。如何獲得兩個表結合記錄使用LINQ C#實體框架?

這是我的方法:

public ActionResult GetUserList(string searchRequest) 
{   
    List<User> userList = new List<User>();    
    if (searchRequest != null) 
    { 
     if (searchRequest == "All") 
     { 
// here i want to write select query but how i don't know 
      userList = db.user.ToList(); 
     } 
     else if (searchRequest == "Flight") 
     { 
      userList = db.user 
       .Where(t => t.type_id == (int)ServiceTypeEnum.Flight) 
       .ToList(); 
     }     
    }          
    return Json(new { data = userList }); 
} 

任何一個有關於這個查詢的想法,那麼請讓我知道該怎麼辦。

+0

如果您可以更具體,這將是有益的。示例數據很好,結果應該如何。 –

+0

它已被翻譯爲選擇查詢,是否想要獲取特定列? –

+0

@MightyBadaboom看起來像用戶表中的東西只需要fname,lname等。 – coderwill

回答

1

,你將在其中選擇特定字段lambda表達式遇到問題列UserDto類是結果通常是一個匿名類型。來自兩個不同查詢的匿名類型不能輕易地在列表中連接在一起,因爲編譯器無法驗證結構或類型的相等性。

這種情況有解決其他的方式...

的最佳實踐方法是創建一個正式的類型定義和使用,這樣就可以操縱你的lambda表達式之外的對象。這裏注意,我假設一個簡單的例子結構是一個子集的用戶:

public ActionResult GetUserList(string searchRequest) 
{ 
    try 
    { 
     List<UserSearchResult> UserList = new List<UserSearchResult>(); 
     if (searchRequest != null) 
     { 
      if (searchRequest == "All") 
      { 
       UserList.AddRange(db.user.Select(u => new UserSearchResult { Title = u.Title, FirstName = u.Firstname, LastName = u.Lastname })); // here i want to write select query but how i don't know 
      } 
      else if (searchRequest == "Flight") 
      { 
       UserList.AddRange(db.user.Where(t => t.type_id == (int)ServiceTypeEnum.Flight) 
        .Select(u => new UserSearchResult { Title = u.Title, FirstName = u.Firstname, LastName = u.Lastname })); 
      } 
     } 
     return Json(new { data = UserList }); 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
    return Json(null); 
} 

public class UserSearchResult 
{ 
    public string Title { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

因爲我們已經明確地鑄就我們的特定字段的選擇的結果,以正式的類型,我們現在可以使用該類型在查詢之外的操作中,甚至可以操縱這些值。

1

定義要選擇

public class UserDto 
{ 
    public int Id{get;set;} 

    public int Name{get;set;} 

    //Other Properties 
} 

然後更改您的代碼如下

public ActionResult GetUserList(string searchRequest) 
{ 
    try 
    {        
     if (searchRequest != null) 
     { 
      IQueryable<User> query; 

      if (searchRequest == "All") 
      { 
       query = db.user.AsQueryable(); // here i want to write select query but how i don't know 
      } 
      else if (searchRequest == "Flight") 
      { 
       UserList = db.user.Where(t => t.type_id == (int)ServiceTypeEnum.Flight); 
      } 

      if(query != null) 
      { 
       var list = query.Select(e=> new UserDto 
       { 
        Id = e.Id, 
        Name = e.Name 
        //Other properties 
       }).ToList(); 

       return Json(new { data = list }); 
      } 
     }          

    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
    return Json(null); 
} 
0

我認爲本地變量阻止你回來。只需返回你想要的結果。

public ActionResult GetUserList(string searchRequest) 
{ 
    if (searchRequest == "All") 
    { 
     var users = db.user 
      .Select(user => new {user.Name, user.Address.ZipCode}) 
      .ToList(); 

     return ToJson(users); 
    } 
    else if (searchRequest == "Flight") 
    { 
     List<User> users = db.user 
      .Where(t => t.type_id == (int)ServiceTypeEnum.Flight) 
      .ToList(); 

     return ToJson(users); 
    } 

    return ToJson(new List<User>()); 
} 

private ActionResult ToJson<T>(T list) 
{ 
    return Json(new { data = list }); 
} 
相關問題