1

私はモデルを持っています:

public partial class VisitorLog
{
    public int Id { get; set; }
    public string VisitorName { get; set; }
    public DateTime TimeIn { get; set; }
    public DateTime TimeOut { get; set; }
    public string CompanyName { get; set; }
    public string EmployeeID { get; set; }
    public string VisitReason { get; set; }

    // Navigation properties
    [ForeignKey("EmployeeID")]
    public virtual Employee Employee { get; set; }
}

汎用リポジトリ:

public class GenericRepository<C, T> : IGenericRepository<T> where T : class where C : DbContext, new()
{
    private C _entities = new C();
    public C Context
    {
        get { return _entities; }
        set { _entities = value; }
    }

    public virtual IQueryable<T> GetAll()
    {
        IQueryable<T> query = _entities.Set<T>();
        return query;
    }

    public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
    {
        IQueryable<T> query = _entities.Set<T>().Where(predicate);
        return query;
    }

    public virtual void Add(T entity)
    {
        _entities.Set<T>().Add(entity);
    }

    public virtual void Delete(T entity)
    {
        _entities.Entry(entity).State = System.Data.EntityState.Deleted;
    }

    public virtual void Edit(T entity)
    {
        _entities.Entry(entity).State = System.Data.EntityState.Modified;
    }

    public virtual void Save()
    {
        _entities.SaveChanges();
    }
}

汎用リポジトリのインターフェース:

public interface IGenericRepository<T> where T : class
{
    IQueryable<T> GetAll();
    IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
    void Add(T entity);
    void Delete(T entity);
    void Edit(T entity);
    void Save();
}

私のモデル固有のリポジ​​トリ(ジェネリックを継承):

public class VisitorLogRepository : GenericRepository<VisitorLogDBContext, VisitorLog>, IVisitorLogRepository {

    public VisitorLog GetSingle(int id)
    {
        var query = GetAll().FirstOrDefault(x => x.Id == id);
        return query;
    }
}

public class SearchViewModel
{
    public IEnumerable<VisitorLog> VisitorLogs { get; set; }
}

ビューモデルをビューにロードしているコントローラー:

    var searchViewModel = new SearchViewModel
{
    VisitorLogs = iVisitorlogRepository.FindBy(v => v.VisitorName.Contains(searchText)
        || v.CompanyName.Contains(searchText)
        || v.EmployeeID.Contains(searchText)),
};

そして最後に私の見解:

@model VisitorLogApp.ViewModels.SearchViewModel

@foreach (var item in ViewData.Model.VisitorLogs) {
    <tr>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
            @Html.ActionLink("Details", "Details", new { id=item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.Id })
        </td>
        <td>
            @item.VisitorName
        </td>
        <td>
            @item.CompanyName
        </td>
        <td>
            @item.Employees.EmployeeName
        </td>
        <td>
            @String.Format("{0:g}", item.TimeIn)
        </td>
        <td>
            @String.Format("{0:g}", item.TimeOut)
        </td>
        <td>
            @item.VisitReason
        </td>
    </tr>

1つの例外を除いて、すべてがうまく機能しています。ビューには、訪問者 (VisitorLog) のリストが表示されます。ナビゲーション プロパティを使用すると、@item.Employees.EmployeeNameを使用するだけで、VisitorLog クラスの従業員 ID の代わりに表示する EmployeeName 値を取得できました。ただし、コントローラーのリポジトリ呼び出しで従業員名で検索できるようにしたい:

VisitorLogs = iVisitorlogRepository.FindBy(v => v.VisitorName.Contains(searchText)
|| v.CompanyName.Contains(searchText)
|| v.Employees.EmployeeName.Contains(searchText)),

ただし、上記の例のEmployees.EmployeeNameは、「v」のリスト メンバーのオプションとして表示されません。

どんな助けでも大歓迎です。

4

1 に答える 1

1

これは単なるタイプミスのようです。クラスのナビゲーション プロパティはEmployeeではなくと呼ばれますEmployees。以下は機能しますか?

VisitorLogs = iVisitorlogRepository.FindBy(
    v => v.VisitorName.Contains(searchText)
    || v.CompanyName.Contains(searchText)
    || v.Employee.EmployeeName.Contains(searchText)),

これが理由である場合は、ビューで同じことを行っています。

于 2012-11-28T17:03:12.947 に答える