1

ナビゲーション プロパティ ProjectNumbers、Addresses、Contacts、および BBLInfos を持つ Project エンティティがあります。各ナビゲーション プロパティの特定のフィールドのみを選択してビュー モデルに保存しようとしています。

ビュー モデルは次のようになります。

public class PropertyInfoViewModel
{
    public ProjectViewModel Project { get; set; }
    public IQueryable<ProjectNumberViewModel> ProjectNumbers { get; set; }
    public IQueryable<AddressViewModel> Addresses { get; set; }
    public IQueryable<BBLInfoViewModel> BBLInfos { get; set; }
    public IQueryable<ContactsViewModel> Contacts { get; set; }
}

Project DbSet で .Include を呼び出すと、関連するエンティティ全体が含まれるため、機能しません。

関連する各テーブルに個別にクエリを作成し、ProjectId がプロジェクトに一致するエンティティを選択することで、これを機能させることができましたが、4 つの個別のテーブル クエリが必要です。関連エンティティからいくつかの列を選択するだけで、関連エンティティを取得するより効率的な方法はありますか?

これは私が現在行っていることです:

 PropertyInfoViewModel model = PropertyInfoViewModel.ViewModelSelector().Invoke(
    new Repository<Project>(epicContext).Get(id),
    new Repository<ProjectNumber>(epicContext).Get(projectNumber => projectNumber.ProjectId == id),
    new Repository<Address>(epicContext).Get(address => address.ProjectId == id),
    new Repository<BBLInfo>(epicContext).Get(bblInfo => bblInfo.ProjectId == id),
    new Repository<Contact>(epicContext).Get(contact => contact.ProjectId == id)

次に、ViewModelSelector は必要なフィールドのみを選択します。

public class PropertyInfoViewModel
{
    public static Func<Project, IQueryable<ProjectNumber>, IQueryable<Address>, IQueryable<BBLInfo>, IQueryable<Contact>, PropertyInfoViewModel> ViewModelSelector()
    {
        return (project, projectNumbers, addresses, bblInfos, contacts, projectInfo) =>
            new PropertyInfoViewModel()
            {
                Project = project,
                ProjectNumbers = projectNumbers.Select(ProjectNumberViewModel.ViewModelSelector()).AsQueryable(),
                Addresss = addresses.Select(AddressViewModel.ViewModelSelector()).AsQueryable(),
                BBLInfos = bblInfos.Select(BBLInfoViewModel.ViewModelSelector()).AsQueryable(),
                Contacts = contacts.Select(ContactViewModel.ViewModelSelector()).AsQueryable(),
            };
    }

ViewModelSelector 関数は、linq クエリの ".select" 部分を 1 回記述するだけでよいので、再利用できます。内部の ViewModelSelector メソッドは、次のような特定のフィールドのみを選択します。

public static Func<Address, AddressViewModel> ViewModelSelector()
    {
        return address => new AddressViewModel()
        {
            ProjectId = address.ProjectId,
            AddressId = address.AddressId,
            StreetNumber = address.StreetNumber,
            StreetName = address.StreetName,
            ZipCode = address.ZipCode
        };
    }

ありがとう!

4

0 に答える 0