2017-05-16 5 views
0

데이터베이스 엔티티를 poco 객체에 매핑하는 데 사용하는 코드를 복제하지 않으려면 어떻게해야합니까?일반적인 linq 표현을 사용하여 poco에 엔티티 중복 방지

private IQueryable<DummyExtended> Find() 
{ 
    return (from dt in Entities.dummy_table 
      select new DummyExtended 
      {       
       Description = dt.table_1.table_2.description,    
       Dummy = new Dummy 
       { 
        Name = d.name, 
        Notes = d.notes, 
        HelpText = d.help_text   
       } 
      }).AsQueryable(); 

} 

내가 두 가지 방법에 대해 다시 사용되는 일반적인 LINQ 식을 만들 수 있습니다

이 코드를 감안할 때?

private IQueryable<DummyExtended> Find() 
{ 
    return (from dt in Entities.dummy_table 
      select new DummyExtended 
      {       
       Description = dt.table_1.table_2.description,    
       Dummy = ...??? 
      }).AsQueryable(); 

} 

private IQueryable<DummyAlsoExtended> FindAnother() 
{ 
    return (from dt in Entities.dummy_table 
      select new DummyAlsoExtended 
      {       
       InnerHtml = dt.table_html.description,    
       Dummy = ....?? 
      }).AsQueryable(); 

} 

예 :

public static Expression<Func<dummy_table, Dummy>> EntityToPoco() 
{ 
    return d => new Dummy 
    { 
     Name = d.name, 
     Notes = d.notes, 
     HelpText = d.help_text 
}; 

}

은 꽤 잘

.... 
Dummy = ExtensionClass.EntityToPoco() 
+0

난 당신이'.AsExpandable을 (LINQKit에보고 할 필요가 있다고 생각 당신이 ToDummy 만든 후

다시, 이것은 한 라이너 될 것입니다)'. – NetMage

답변

0

그래서 당신은 객체 Enumerable에서 또는 Queryable에서 순서 인 dummy_table이 그것을 얻을 수 없습니다 . 시퀀스에 DummyTableElement 클래스의 객체가 있다고 가정 해 봅시다.

DummyTableElement이있는 경우 Dummy 개체로 변환하는 방법을 알고있는 것으로 나타났습니다. 이 함수를 다시 사용하여 DummyExtendedDummyAlsoExtended과 같은 다른 객체를 만들고 싶습니다. 이 LINQ-모두를 수행 할 경우, 그것을 위해 확장 기능을 작성하는 것이 좋습니다 : 당신이 일단

static class DummyTableElementExtensions 
{ 
    public static Dummy ToDummy(this TableElement tableElement) 
    { 
     return new Dummy() 
     { 
      Name = tableElement.name, 
      Notes = tableElement.notes, 
      HelpText = tableElement.help_text  
     }; 
    } 
} 

, 당신은 DummyExtendedDummyAlsoExtendedTableElements 변환 유사한 기능을 만들 수 있습니다. 그들은 하나의 라이너가 될 것입니다. 같은 확장 클래스에서

:

public static DummyExtended ToDummyExtended(this TableElement tableElement) 
{ 
    return new DummyExtended() 
    { 
     Description = tableElement.table_1.table_2.description, 
     Dummy = tableElement.ToDummy(),    
    }; 
} 
public static DummyAlsoExtended ToDummyAlsoExtended(this TableElement tableElement) 
{ 
    return new DummyAlsoExtended 
    {       
     InnerHtml = tableElement.table_html.description,    
     Dummy = tableElement.ToDummy(), 
    }; 
} 

그리고 당신이있어 일단 당신이 변환 확장 기능을 만들 수있는 IQueryableTableElements의 :

public static IQueryable<DummyExtended> ToDummyExtended(
    this IQueryable<TableElement> tableElements) 
{ 
    return tableElements 
     .Select(tableElement => tableelement.ToDummyExtended(); 
} 

와 유사한 한 줄 DummyAlsoExtended에 대한 기능 이에 식을 사용하고 싶었 이유를 잘 모르겠어요

private IQueryable<DummyExtended> Find() 
{ 
    return dummy_table.ToDummyExtended(); 
} 

private IQueryable<DummyAlsoExtended> FindAnother() 
{ 
    return dummy_table.ToDummyAlsoExtended(); 
} 

:

당신의 Find 기능과 FindAnother 기능은 한 - 라이너 될 것입니다. DummyExtendedDummyAlsoExtended은 실제로 비슷하지만 둘 다 속성이 Dummy 인 것만 큼 다른 것 같습니다.

찾기 기능에서 익명의 클래스를 만들기 때문에 찾기 기능의 대상을 매개 변수화하는 한 가지 이유가있을 수 있습니다.

public static IQueryable<TResult> Find<TSource, TResult>(
    this IQueryable<TSource> source, 
    Expression<Func<TSource, TResult>> resultSelector) 
{ 
    return source.Select(sourceElement => resultSelector(sourceElement); 
} 

사용법은 다음과 같습니다 :

var X = dummy_Table.find(tableElement => new 
    { 
     foo = tableElement.CalculateFoo(), 
     bar = tableElement.CalculateBar(), 
     Dummy = tableElement.ToDummy(), 
    }); 
+0

사용자 지정 (확장) 메서드는 LINQ to Entities 식 트리 내에서 지원되지 않습니다. –