2016-07-05 5 views
0

그래서 난 문제는이 사용자가 내가 passwordHash 또는 이메일 등의 반환하지 않는 다른 특성을 가지고있다이 LINQ 쿼리를속성을 제거하거나 쿼리의 객체를 해당 유형을 변경하지 않고 null로 설정할 수 있습니까?

var users = from user in dbContext.Users 
      where user.IsPublic 
      select user; 

있습니다.

또한 사용자가 AspNetIdentityUser

엔티티 또는 복합 형 'MyProject.User'엔티티 질의에 LINQ에 건설 할 수없는 확장 아마 때문에 ..이 고전적인 오류에 new User{Id=user.Id, First...} 결과로 선택.

나는 내가 새로운 클래스를 만들고 그것으로 선택할 수 있습니다 알고 있지만 나는이 적어도-때 널 (null)로 설정 User에서 속성/필드를 제거하는 것이 가능 형 User

의 수 반환합니다 유형을 변경하지 않고 쿼리를 작성합니까?

+2

익명 형식으로 검색 https://msdn.microsoft.com/en-GB/library/bb397696.aspx –

+0

당신은 단지'new {Id = user.Id, First ...}'시도했습니다 익명의 객체를 만듭니다 –

+0

지금 당장 그것을 시도했습니다 .... 응용 프로그램 사용자에게 캐스팅은 null null – konzo

답변

2

당신은 익명의 유형에 필요한 모든 속성을 선택할 수있는 결과를 구체화 한 다음 사용자의 목록을 작성하기 위해 사용 :

이보십시오. 첫 번째 쿼리는 SQL과 같은 구문, 두 번째 체인 구문을 사용합니다.

private static void Main(string[] args) 
{ 
    List<User> Users = new List<User>() 
    { 
     new User {Id = 1, Name = "N1", IsPublic = true}, 
     new User {Id = 2, Name = "N2", IsPublic = true}, 
     new User {Id = 3, Name = "N3"} 
    }; 

    var users1 = from u in (from user in Users 
     where user.IsPublic 
     select new {user.Id, user.Name}).ToList() 
     select new User {Id = u.Id, Name = u.Name}; 

    var users2 = 
     Users.Where(x => x.IsPublic) 
      .Select(user => new {user.Id, user.Name}) 
      .ToList() 
      .Select(x => new User {Id = x.Id, Name = x.Name}); 

    Console.ReadLine(); 

} 
+0

이 작동하지만 IEnumerable 반환 된 형식으로 모두 제공합니다 싶었어요 IQueryable .. 고마워요 나는 이걸로 스틱 것이다하지만 난 정말 IQueryable에서 기능을 싶었어요 – konzo

1

분명히 Linq To Entities 문에서 데이터베이스에 매핑 된 엔티티를 새로 만들 수 없습니다.

이렇게하면 부분 결과를 매핑 된 클래스로 선택할 수 없습니다. 별도의 클래스를 생성하고 반환하는 대신 동일한 클래스를 사용하는 대신이 함수 시그니처가 매우 오도 될 수 있으므로 전체 사용자 객체를 반환 할 것으로 기대할 수 있습니다.

필요한 값을 선택한 다음 쿼리 외부에서 사용자를 만들어이 문제를 해결할 수 있습니다. ,

public List<User> GetPublicUsers() 
{ 
    var existingUsers = dbContext.Users 
     .Where(u => u.IsPublic); 

    var result = new List<User>(); 
    foreach(var existingUser in existingUsers) 
    { 
     result.Add(new User { Id = existingUser.Id, ...})); 
    } 
    return result; 
} 
+0

이것은 ' 또는 복잡한 유형 'MyProject.User'는 LINQ to Entities 쿼리에서 생성 될 수 없습니다. 왜냐하면 나는 aspIdentityUser를 확장하고 있기 때문에 생각합니다. – konzo

+0

죄송합니다. 나는 나의 대답을 업데이트했다. –

+0

'IQueryable '이 반복기 인터페이스 유형이 아니기 때문에'YourProject.Users() '의 본문이 반복자 블록이 될 수 없습니다' – konzo

0

음이 ... 난 그냥 그 값을 수정하는 관리 한 반환 형식이 난 완전히 일부 열을 숨기 싶다고로이 아직 완료되지 않았습니다 된 IQueryable해야했다 볼 수있는이 개 답변에서 너무 많이 그립니다 .. 난 정말 우리가 그냥 ID와 이름을 필요로하는 산들 바람 위치를 보이지 않는 난 정말이 열을 기원합니다

public IQueryable<User> Users() 
{ 

    var users = from user in _db.Context.Users 
     where user.IsPublic 
     select user; 


    foreach (var user in users) 
     { 
      user.PasswordHash = null; 
      user.PhoneNumber = null; 
      user.Logins.Clear(); 
      user.Email = null; 
      user.AccessFailedCount = 0; 
      user.Roles.Clear(); 
      user.SecurityStamp = null; 
      user.TwoFactorEnabled = user.EmailConfirmed = user.PhoneNumberConfirmed = false; 
      user.Claims.Clear(); 
     } 
     return users; 
    } 

우리의 스키마 너무 많이 노출 만들기위한 breezejs 싫어 ...하지만 .. 난이 할 것 같아요 .. 지금은