여러분!Linq2Sql에서 사용자 정의 유형을 이해하는 방법은 무엇입니까?
'도메인 : IUser, IAddressBook, IComment
'등의 문제를 나타내는 인터페이스가 있다고 가정 해 보겠습니다. 다음과 같이 IUser
가 정의되어 있다고 가정 : 예를 들어, 난 단지 언급 계약을 사용하여 내 응용 프로그램에서
public interface IUser : IAmIdentifiedEntity<int>, IHaveName
{
string FullName { get; set; }
string Email { get; set; }
bool ReceiveNotification { get; set; }
}
public interface IHaveName
{
string Name { get; set; }
}
을 :
public IUser GetUser(string userName)
{
return Warehouse.GetRepository<IUser>().GetAll()
.First(u => u.Name == userName);
}
당신이 볼 수 있듯이
, 나는 데이터를 얻기 위해 약간의 게이트웨이를 사용하고 있습니다. Repository '메서드GetAll()
은
IQueryable<TEntity>
을 반환하므로 일부 복잡한 쿼리를 작성하고 지연로드의 모든 이점을 사용할 수 있습니다. 내가 그것을 소개 할 때, 나는 Linq2Sql의 어플라이언스에 대해 미래에 생각했다.
얼마 동안 클라이언트 코드를 개발하는 동안 우리는 데이터 저장소의 '메모리 내 (in-memory)'구현을 사용하고있었습니다. 그래서 모든 것이 잘 작동합니다. 그러나 이제 도메인을 SQL Server에 바인딩 할 차례입니다. 그래서 Linq2Sql에 모든 인프라를 구현하기 시작했습니다 ... 그리고 간단한 솔루션 (Fredrik Kalseth의 article에서 영감을 얻었습니다)이 첫 번째 예외를 얻었을 때, 나는 그 아이디어의 모든 슬픔을 깨달았습니다. 여기에 함축이 있습니다. 여기
public partial class USER : IUser
{
int IHaveID<int>.ID
{
get { return USERID; }
}
string IHaveName.Name
{
get { return USERNAME; }
set { USERNAME = value; }
}
string IUser.FullName
{
get { return USERFULLNAME; }
set { USERFULLNAME = value; }
}
// ... same approach for other properties
}
그리고 - 예외 : IUser
의
Exception: System.NotSupportedException:
The member 'Data.IHaveName.Name' has no supported translation to SQL.
이 분명 예외는 - Linq2Sql 공급자가 외부 인터페이스를 이해하지 않지만, 어떻게 그것을 해결해야 하는가? 이 도메인의 모든 인터페이스 현재 코드 사용을 나누기 때문에
Expression<Func<string>> IHaveName.Name
{
get { return (() => USERNAME); }
set { USERNAME = value(); }
}
하고 또한 내가 종교적 신념 Expression<Func<int>>
와 int
을 대체 할 수 없습니다 :
어쩌면, 나는
당신이 그것에 의견을 제공 할 수 있습니다 ... 그것의 내부 하위 AST와 함께 IUser.SomeProperty
의 '쿼리에서 AST 통화를 건너 뛰고 교체하는 사용자 정의 식 방문자를 작성해야?
업데이트. 여기에 Repository
구현에 대해 뭔가 작성해야합니다. 내 예에서
public IQueryable<TEntity> GetAll()
{
ITable table = GetTable();
return table.Cast<TEntity>();
}
protected ITable GetTable()
{
return _dataContext.GetTable(_implType);
}
, TEntity <=> IUser
내가 OP는 모두 문제가 related question을 발견했습니다 2._implType <=> typeof(USER)
UPDATE : GetAll()
소스 봐 콘크리트 ORM의 실체와 그것의 사이에 다리를 필요 도메인 엔티티. 흥미로운 사실을 발견했습니다. the answer : 작성자가 표현 방문자를 생성하도록 제안 했으므로 엔티티 간 변환이 수행됩니다 (ORM < => 도메인).
새로운 제안이 있으십니까? – ajukraine