Question

J'utilise le modèle de spécification et ont une implémentation de travail (prise du projet WhoCanHelpMe Codeplex) pour obtenir des données via NLinq, référentiels génériques et tout ce que la bonté.

La méthode de la racine est la suivante:

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

La méthode FindAll () effectue les opérations suivantes:

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

Et, SatisfyingElementsFrom () fait ceci:

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();
}

Alors, pour interroger les cas par la propriété CaseNb d'un cas, il est assez straight-forward. Une spécification comme celui ci-dessous fonctionne pour moi et obtient les cas je veux.

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); }
    }

}

Cependant, je suis à une perte de comprendre comment faire cela lors de la traversée de plusieurs entités. Ce que je voudrais avoir est une spécification qui me permet d'obtenir par cas UserName. En fait, dans la base de données, il y a trois tables et celles-ci ont été réalisées dans des entités. Voici ce sont des entités:

Voici la classe de cas:

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; } }
}

Voici le CaseUser:

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

, l'utilisateur:

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; } }
}

Comment puis-je écrire l'expression pour obtenir les données sur la table d'association?

Était-ce utile?

La solution

Je crois que votre mise en œuvre de la spécification devrait ressembler à ceci:

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); } 
    } 

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top