人!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);
}
あなたが見ることができるように
は、私がデータを取得するために、いくつかのゲートウェイを使用しています。リポジトリのメソッドGetAll()
は
IQueryable<TEntity>
を返すので、複雑なクエリを作成し、遅延読み込みのメリットをすべて利用することができます。私がそれを紹介したとき、私はLinq2Sqlのアプライアンスを将来考えました。
クライアントコードの開発中に、私たちはデータ記憶域の「メモリ内」実装を使用していました。だからすべてうまく動作します。しかし、今度はドメインをSQL Serverにバインドする必要があります。だから私はLinq2Sqlにすべてのインフラストラクチャを実装し始めました...そして、簡単な解決策(フレドリック・カールスセスのarticleからインスピレーションを受けた)が最初の例外を得たとき、私はそのアイデアのすべての悲しみを実現しました... IUser
の:
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
}
そしてここで - 例外:
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
を交換することはできません:)
たぶん、私はIUser.SomeProperty
のクエリ」ASTの呼び出しにスキップして、それが内側のサブASTだとそれを置き換えるためにカスタム式のビジターを書く必要があります...
は、あなたはそれに自分の考えを提供することはできますか?
UPDATE。ここでは、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:著者は、エンティティ間の変換を実行するexpression visitorを作成することを提案しました(ORM < =>ドメイン)。
新しい提案がありますか? – ajukraine