2016-08-15 3 views
1

내가 LINQ에 복제하려고 쿼리는 다음과 같습니다LINQ를 조인 테이블에서 사용하는 방법?

SELECT count(*) FROM joinTable WHERE object1ID = input_parameter1_from_code 
AND object2ID = input_parameter2_from_code; 

나는 IdentityDbContext에 액세스 할 수 있지만, 그것은 단지 구성 객체에 대한 참조 포함 '하지 조인 테이블 자체에 테이블을, 그래서 돈' 그 결과를 얻기 위해 무엇을 찾아야 할지를 안다.

또는 원시 쿼리를 사용할 수 있다면이 방법을 알고 싶습니다. 감사합니다. 쿼리 구문에서

+0

'? 그것은 데이터베이스에있는 테이블입니까? 관점? –

+0

@GiladGreen 예 내 데이터베이스의 테이블입니다. – ITWorker

+0

@GiladGreen 예 일반 일반 테이블의 이름입니다. 그것은 실제로 "AppRoleAppPrivileges"라고하지만 여기에 내 질문에 "joinTable"로 만들었습니다. – ITWorker

답변

3

("가입" "junction") 테이블. 이런 식으로 뭔가 (당신이 UserRole에 대해 말하고있는,하지만 그건 중요하지의 가능성) :이 링크 테이블에 직접 액세스 할 수 없지만

public class One 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Two> Twos { get; set; } 
} 

public class Two 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<One> Ones { get; set; } 
} 

public class MyDbContext : DbContext 
{ 
    public DbSet<One> Ones { get; set; } 
    public DbSet<Two> Twos { get; set; } 
} 

, 당신은 결합 된 두 개의 "주요"테이블 중 하나를 사용할 수 있습니다 다른 탐색 속성으로

var db = new MyDbContext(); 

을 부여 그래서

, 모두

int count = 
    (from one in db.Ones 
    from two in one.Twos 
    where one.Id == input_parameter1_from_code && two.Id == input_parameter2_from_code 
    select new { one, two }) 
    .Count(); 

int count = 
    (from two in db.Twos 
    from one in two.Ones 
    where one.Id == input_parameter1_from_code && two.Id == input_parameter2_from_code 
    select new { one, two }) 
    .Count(); 

과 유사한 동일한 SQL 쿼리를 생성합니다 :

SELECT 
    [GroupBy1].[A1] AS [C1] 
    FROM (SELECT 
     COUNT(1) AS [A1] 
     FROM [dbo].[TwoOne] AS [Extent1] 
     WHERE (1 = [Extent1].[One_Id]) AND (2 = [Extent1].[Two_Id]) 
    ) AS [GroupBy1] 

당신이 볼 수 있듯이 링크 테이블에 대한 것입니다.

+0

예 모델 정의에서 자동 생성 된 다 대다 관계 테이블입니다. 이것은 내가 찾고 있었던 바로 그 것이다. 감사! – ITWorker

2

: 방법 구문에서

var amount = (from record in DBcontext.joinTable 
       where record.object1ID = input_parameter1_from_code && 
        record.object2ID = input_parameter2_from_code 
       select record).Count(); 

:

var amount = DBcontext.joinTable 
         .Where(record => record.object1ID = input_parameter1_from_code && 
             record.object2ID = input_parameter2_from_code) 
         .Count(); 
+0

내가 DBcontext를 가지고 있다고 말하는 내 질문에 실수를 범했지만 실제로는 IdentityDbContext입니다. 또한 db 문맥에 joinTable에 대한 정의가 없다는 오류가 발생합니다. db 테이블 이름이기 때문에 joinTable이 일종의 문자열이어야 하는가? – ITWorker

1

당신은 확실히 DbContext와 해당 쿼리를 사용할 수 있습니다. 여기 MSDN 설명서에서보세요 : 뭔가처럼

https://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.executequery(v=vs.110).aspx

그것은 될 것입니다 : 당신이 마음에 암시 "링크"와 many-to-many 관계가 있다고 가정

var Count = DbContext.ExecuteQuery("SELECT count(*) FROM joinTable where object1ID = input_parameter1_from_code 
AND object2ID = input_parameter2_from_code;"); 
+0

IDDbContext를 사용하여이 작업을 시도하고 있으므로 쿼리를 'var Count = db.Database.ExecuteSqlCommand ("EXEC SELECT count (*) FROM dbo.AppRoleAppPrivileges에서 AppRole_Id ="+ roleId + "및 AppPrivilege_ID ="+ privId + "로 변경해야했습니다. ; ");'하지만 지금은 EXEC' – ITWorker

+0

db.Database.ExecuteS qlCommand ("SELECT count (*) FROM dbo.AppRoleAppPrivil eges가없는 경우에도 디버거에서 구문 오류가 발생합니다. 여기서 AppRole_Id = "+ roleId + "AND AppPrivilege_ID ="+ privId + ";"); – ProgrammerV5

+1

아니요,이 작업을 수행하지 마십시오. 매개 변수화 된 쿼리를 사용해야합니다. [DbContext.Database.ExecuteSqlCommand 메서드에 매개 변수를 전달하는 방법?] (http://stackoverflow.com/questions/5474264/how-to-pass-parameters-to-the-dbcontext-database-executesqlcommand-method) –

2

쿼리와 함께 사용해야하는 원시 SQL 쿼리와 함께 sql parameter을 사용하는 방법은 sql injection을 피하는 것이므로 Database.SqlQuery 메서드를 사용할 수 있습니다.

다음과 같이하십시오 :

var data = yourContext.Database.SqlQuery<int>(
    "SELECT count(*) FROM joinTable WHERE object1ID = @code1 AND object2ID = @code2", 
    new SqlParameter("@code1", input_parameter1_from_code), 
    new SqlParameter("@code2", input_parameter2_from_code) 
); 

당신이 didnt 한 일이 :)

+0

감사 :이 변형은 다른 쿼리에서 작동했습니다. YourContext.Database.SqlQuery 을 YourContext.YourObject.SqlQuery'로 대체해야하는데, YourObject는 모델이고'; '앞에'.ToList() '를 추가해야합니다. 결국. 이것은 단순히 카운트가 아닌 객체의 목록을 반환하는 것이 었습니다. – ITWorker

0

이 작동합니다 알려줘도 링크 테이블의 경우`관절 식 무엇

dbContext.CollectionOne.where(x => x.Id == 1).SelectMany(x => x.Collection2).where(y => y.Id == 2).Count() 
관련 문제