2

私は仕様パターンを使用しており、NLinq、汎用リポジトリ、およびそのすべての利点を介してデータを取得するための実用的な実装 (WhoCanHelpMe Codeplex プロジェクトから取得) を持っています。

ルート メソッドは次のとおりです。

public IList<Case> GetCasesByUsername(string username)
{
    CaseByUserNameSpecification spc = new CaseByUserNameSpecification(username);
    return this.caseRepository.FindAll(spc).ToList();
}

FindAll() メソッドは次のことを行います。

public IQueryable<T> FindAll(ILinqSpecification<T, T> specification)
{
    return specification.SatisfyingElementsFrom(this.Session.Linq<T>());
}

そして、SatisfyingElementsFrom() はこれを行います:

public virtual IQueryable<TResult> SatisfyingElementsFrom(IQueryable<T> candidates)
{
    if (this.MatchingCriteria != null)
    {
        return candidates.Where(this.MatchingCriteria).ToList().ConvertAll(this.ResultMap).AsQueryable();
    }

    return candidates.ToList().ConvertAll(this.ResultMap).AsQueryable();
}

したがって、Case の CaseNb プロパティによるケースのクエリは、非常に簡単です。以下のような仕様は私にとっては機能し、必要なケースを取得します。

public class CaseByCaseNbSpecification : QuerySpecification<User>
{
    private string caseNb;

    public CaseByCaseNbSpecification(string caseNb)
    {
        this.caseNb = caseNb;
    }

    public string UserName
    {
        get { return this.caseNb; }
    }

    public override Expression<Func<Case, bool>> MatchingCriteria
    {
        get { return u => u.CaseNb.Equals(this.caseNb, StringComparison.CurrentCultureIgnoreCase); }
    }

}

ただし、複数のエンティティをまたぐときにこれを行う方法を理解するのに途方に暮れています。私が欲しいのは、UserName でケースを取得できる仕様です。基本的に、データベースには 3 つのテーブルがあり、これらはエンティティに持ち込まれています。エンティティは次のとおりです。

ケースクラスは次のとおりです。

public class Case : Entity
{
    private ICollection<CaseUser> caseUsers = new HashSet<CaseUser>();

    public virtual Patient Patient { get; set; }
    public virtual string CaseNb { get; set; }
    ...
    public virtual IEnumerable<CaseUser> CaseUsers { get { return caseUsers; } }
}

CaseUser は次のとおりです。

public class CaseUser : Entity
{
    public virtual Case Case { get; set; }
    public virtual User User { get; set; }
    ...
}

そして、ユーザー:

public class User : Entity
{
    private ICollection<CaseUser> caseUsers = new HashSet<CaseUser>();

    public virtual Account Account { get; set; }
    public virtual string UserName { get; set; }
    ...
    public virtual IEnumerable<CaseUser> CaseUsers { get { return caseUsers; } }
}

関連テーブル全体でデータを取得する式をどのように記述しますか?

4

1 に答える 1

0

仕様の実装は次のようになるはずです。

public class CaseByUsernameSpecification : QuerySpecification<Case> 
{ 
    private string userName; 

    public CaseByUsernameSpecification(string userName) 
    { 
        this.userName = userName; 
    } 

    public string UserName 
    { 
        get { return this.userName; } 
    } 

   public override Expression<Func<Case, bool>> MatchingCriteria 
    { 
        get { return c => c.CaseUsers.Any(cu => cu.User.Username == this.userName); } 
    } 

}
于 2010-09-01T09:49:43.550 に答える