0

私は次の方法を持っています:

public AgentContact GetAgentContacts(Expression<Func<AgentContact, bool>> predicate)
{ 
    return _db.AgentContacts.Where(predicate).First();
}

私は次のように呼び出します:

var agentcontacts = _rep.GetAgentContacts(agent => agent.AGENTID == id);

式ツリーの解析について調べたことはありません。私がする必要があるのは、必要なエンティティ フレームワークのドメイン モデル データベース テーブルの列名が使用されていることを確認することです。この場合は「AGENTID」です。これを拡張するには、この呼び出しのラムダ式のように、いくつかのデータベース列名を解析できるようにする必要があります。

var busAddress = _rep.GetBusAddresses(ba=>ba.BUSID==id && ba.ADDRESS_TYPE == addressTyp);
if (busAddress.Any())
{ 
    return View(busAddress.First());
}

「BUSID」と「ADDRESS_TYPE」を探します。これはすべて、式がクエリ対象のテーブルの主キーを使用しているかどうかを確認するためのものです。主キーを使用する場合、既存のストアド プロシージャを使用する必要があります。

リソースへのヘルプや指示は本当に役に立ちます。

============== 追加要件 ===================== この質問の続きとして、どのようにコーディングしますか?式にエンティティのパブリック プロパティのみが含まれていることを確認するには?

4

1 に答える 1

0

私があなたを正しく理解Expressionしていれば、特定のプロパティがその式でアクセスされているかどうかを知りたいと思っています。それを見つけるには、ExpressionVisitor: override itsVisitMember()を使用して、式のメンバーを探しているメンバーと比較します。

コード全体は次のようになります。

public class ExpressionPropertyFinder<T>
{
    private readonly ExpressionPropertyFinderVisitor m_visitor;

    private ExpressionPropertyFinder(MemberInfo member)
    {
        m_visitor = new ExpressionPropertyFinderVisitor(member);
    }

    // constructor can't be generic
    public static ExpressionPropertyFinder<T> Create<TProperty>(
        Expression<Func<T, TProperty>> propertyExpression)
    {
        return new ExpressionPropertyFinder<T>(
            ((MemberExpression)propertyExpression.Body).Member);
    }

    public bool IsMemberAccessed(Expression<Func<T, bool>> expression)
    {
        return m_visitor.IsMemberAccessed(expression);
    }
}

class ExpressionPropertyFinderVisitor : ExpressionVisitor
{
    private readonly MemberInfo m_member;

    private bool m_found;

    public ExpressionPropertyFinderVisitor(MemberInfo member)
    {
        m_member = member;
    }

    public bool IsMemberAccessed(Expression expression)
    {
        m_found = false;
        Visit(expression);
        return m_found;
    }

    protected override Expression VisitMember(MemberExpression node)
    {
        if (node.Member == m_member)
            m_found = true;

        return base.VisitMember(node);
    }
}

次に、次のように使用します。

var finder = ExpressionPropertyFinder<Entity>.Create(e => e.Id);

finder.IsMemberAccessed(e => e.Id == 42) // true
finder.IsMemberAccessed(e => e.Name == "foo") // false
finder.IsMemberAccessed(e => e.Id == 42 && e.Name == "foo") // true
于 2013-05-25T19:35:07.923 に答える