2013-09-26 1 views
3

테이블에 정의 된 관계가없는 Product 테이블이 있습니다. Product POCO에 Translation 속성을 [NotMapped]으로 추가했습니다.Entity Framework - 하나의 쿼리 내에서 '위조 된'탐색 속성 가져 오기

는 ** 내 제품 POCO : **

public partial class Product 
{ 
    public int ProductID { get; set; } 

    public double Price { get; set; } 

    [NotMapped] 
    public virtual Translation Translation{ get; set; } 

    /** Other properties **/ 
} 

나는 또한 Translation 테이블을 가지고 있고, 이름을 말한다처럼, 모든 번역이 포함되어 있습니다. 이제 오른쪽 translationLanguageID, TranslationOriginIDValueID의 세 가지 매개 변수를 제공하여 데이터베이스에서 검색 할 수 있습니다.

  • LanguageID : 사용자가 정의한 언어의 ID.
  • TranslationOriginID : 단순히 '번역하려는 엔티티가있는 테이블이 무엇입니까?' 즉,이 ID는 가능한 모든 출처를 포함하는 다른 테이블을 가리 킵니다. 원점은 translation을 가질 수있는 테이블/엔티티입니다. 예 :이 예의 원점은 Product입니다.
  • ValueID : 이것은 내가 translation을 원하는 엔티티의 ID입니다.

Translation POCO : I가 실행

List<Product> products = context.Products.ToList(); 

foreach (Product product in products) 
{ 
     product.Translation = context.Translations.FirstOrDefault(y => y.LanguageID == 1 && y.TranslationOriginID == 2 && y.ValueID == product.ProductID); 
} 

당신이 볼 수 마찬가지로 : 나는 그들의 Translation 모든 제품을 검색 할

public partial class Translation 
{ 
    public int TranslationID { get; set; } 

    public byte LanguageID { get; set; } 

    public short TranslationOriginID { get; set; } 

    public int ValueID { get; set; } 

    public string TranslationValue { get; set; } 

    /** Other properties **/ 

    public virtual TranslationOrigin TranslationOrigin { get; set; } 

    public virtual Language Language { get; set; } 
} 

, 나는이 코드를 실행 목록에있는 모든 제품은 번역을 얻기 위해 다른 쿼리를 사용합니다.

내 질문 : 모든 제품과 해당 번역을 하나의 쿼리로 가져올 수 있습니까? 또는 product을 선택할 때 자동으로 올바른 번역을 검색합니까?

나는 이미 .Include().Select()을 시도했다. 그것은 작동하지 않았다, 아마 내가 뭔가 잘못한거야? this method도 시도했지만 작동하지 않았습니다.

Btw, .NET Framework 4 (Entity Framework 4.4)와 함께 Entity Framework 5를 사용합니다.

미리 감사드립니다.

인사말 Loetn


Ed Chapel에 의해 주어진 예와 대답

는, I는 해결책을 제공했다.

return (from p in context.Products 
      join t in context.Translations 
      on new 
      { 
       Id = p.ProductID, 
       langId = languageID, 
       tOriginId = translationOriginID 
      } 
      equals new 
      { 
       Id = d.ValueID, 
       langId = d.LanguageID, 
       tOriginId = d.TranslationOriginID 
      } 
      into other 
      from x in other.DefaultIfEmpty() 
      select new 
      { 
       Product = p, 
       Translation = x 
      }) 
      .ToList().ConvertAll(x => new Product() 
      { 
       Code = x.Product.Code, 
       Translation = x.Translation, 
       /** Other properties **/ 
      }); 

답변

0

을 예제와 함께 해결책으로 제안 Ed Chapel, 나는이 해낸 것이다.

return (from p in context.Products 
       join t in context.Translations 
       on new 
       { 
        Id = p.ProductID, 
        langId = languageID, 
        tOriginId = translationOriginID 
       } 
       equals new 
       { 
        Id = d.ValueID, 
        langId = d.LanguageID, 
        tOriginId = d.TranslationOriginID 
       } 
       into other 
       from x in other.DefaultIfEmpty() 
       select new 
       { 
        Product = p, 
        Translation = x 
       }) 
       .ToList().ConvertAll(x => new Product() 
       { 
        Code = x.Product.Code, 
        Translation = x.Translation, 
        /** Other properties **/ 
       }); 
2

대부분의 경우 적절한 LINQ가 마음에 들지 않습니다.x.Product.Translation = x.Translation 설정 결과를 통해

from p in context.Products 
join t in context.Translations 
    on t.ValueID equals p.ValueID 
     && t.LanguageID == 1 
     && t.TranslationOriginID == 2 
    into joinT 
from x in joinT 
select new { 
       Product = p, 
       Translation = t, 
      }; 

당신을 다음 루프 그러나, join은 LINQ가 확장 방법보다 쉽게 ​​하나 개의 시나리오이다.

+0

당신이 옳았습니다. 당신이 만든 유일한 실수는 join 문에서 여러 매개 변수를 사용하는 것입니다. 올바른 솔루션으로 편집 된 게시물을 볼 수 있습니다. – Loetn

0

먼저 번역 테이블이 dba와 같은 구조로되어 있지 않다는 것을 알아야합니다.
OriginId 값에 따라 다른 테이블을 참조하기 때문에 비 강제 관계가 있습니다. 이 때문에
당신은 게으른 로딩을 사용하거나 EF에서 포함 할 수 없습니다.
이 시점에서 최선의 아이디어는 수동으로 익명 형식 (originId 포함)의 테이블에 조인하는 것입니다. 그 후이 같을 것이다 번역 속성을

결과를 설정하는 결과를 반복 할 수 있습니다

var data = from p in context.Products 
      join pt in context.Translations on new{p.Id,2} equals new {pt.ValueId, pt.OriginId} into trans 
      select new {p, trans}; 
var result = data.ToList().Select(a => 
       { 
        a.p.Translations = a.trans; 
        return a.p; 
       }).ToList();