0

現在、プロジェクトに次のコードがあります

   public List<PermissionValue> GetUnderlyingPermissionsForUser(string userName, int guiPermissionTypeId, int productTypeId)
    {
        using (CliVeEntities db = new CliVeEntities())
        {             
            var listUnderlyings = (from gui in db.GuiPermissionUnderlying
                                join bue in db.BranchUsersExternal on gui.BranchUsersId equals bue.BranchUsersID     
                                join bu in db.BranchUsers on bue.BranchUsersID equals bu.BranchUsersId
                                where bu.UserName == userName && gui.ViewTypeId == guiPermissionTypeId
                                && gui.UnderlyingId.HasValue
                                && !gui.SectorId.HasValue
                                && gui.ProductTypeId == null
                                && gui.ProductGroupId == null
                                select new PermissionValue { Id = gui.UnderlyingId.Value, Visible = gui.value}).ToList<PermissionValue>();


            var listUnderlyingsProductGroup = (from gui in db.GuiPermissionUnderlying
                                                join bue in db.BranchUsersExternal on gui.BranchUsersId equals bue.BranchUsersID
                                               join bu in db.BranchUsers on bue.BranchUsersID equals bu.BranchUsersId
                                               join pg in db.ProductGroup on gui.ProductGroupId equals pg.ProductGroupId
                                               join pt in db.ProductType on pg.ProductGroupId equals pt.ProductGroupId
                                               where bu.UserName == userName && gui.ViewTypeId == guiPermissionTypeId
                                               && gui.UnderlyingId.HasValue
                                               && !gui.SectorId.HasValue
                                               && pt.ProductTypeId == productTypeId
                                               select new PermissionValue { Id = gui.UnderlyingId.Value, Visible = gui.value }).ToList<PermissionValue>();




            var listUnderlyingsProductType = (from gui in db.GuiPermissionUnderlying
                                                join bue in db.BranchUsersExternal on gui.BranchUsersId equals bue.BranchUsersID
                                              join bu in db.BranchUsers on bue.BranchUsersID equals bu.BranchUsersId
                                              where bu.UserName == userName && gui.ViewTypeId == guiPermissionTypeId
                                              && gui.UnderlyingId.HasValue
                                              && !gui.SectorId.HasValue
                                              && gui.ProductTypeId == productTypeId
                                              select new PermissionValue { Id = gui.UnderlyingId.Value, Visible = gui.value }).ToList<PermissionValue>();


            var listUnderlyingsForSectors = (from gui in db.GuiPermissionUnderlying
                                             join bue in db.BranchUsersExternal on gui.BranchUsersId equals bue.BranchUsersID
                                             join bu in db.BranchUsers on bue.BranchUsersID equals bu.BranchUsersId
                                             join u in db.Underlying on gui.SectorId equals u.SectorId
                                             where bu.UserName == userName && gui.ViewTypeId == guiPermissionTypeId
                                             && !gui.UnderlyingId.HasValue
                                             && gui.ProductTypeId == null
                                             && gui.ProductGroupId == null
                                             select new PermissionValue { Id = u.UnderlyingId, Visible = gui.value }).ToList<PermissionValue>();


            var listUnderlyingsForSectorsProductGroup = (from gui in db.GuiPermissionUnderlying
                                                        join bue in db.BranchUsersExternal on gui.BranchUsersId equals bue.BranchUsersID
                                                         join bu in db.BranchUsers on bue.BranchUsersID equals bu.BranchUsersId
                                                         join u in db.Underlying on gui.SectorId equals u.SectorId
                                                         join pg in db.ProductGroup on gui.ProductGroupId equals pg.ProductGroupId
                                                         join pt in db.ProductType on pg.ProductGroupId equals pt.ProductGroupId
                                                         where bu.UserName == userName && gui.ViewTypeId == guiPermissionTypeId
                                                         && !gui.UnderlyingId.HasValue
                                                         && pt.ProductTypeId == productTypeId
                                                         select new PermissionValue { Id = u.UnderlyingId, Visible = gui.value }).ToList<PermissionValue>();

            var listUnderlyingsForSectorsProductType = (
                                                        from gui in db.GuiPermissionUnderlying
                                                        join bue in db.BranchUsersExternal on gui.BranchUsersId equals bue.BranchUsersID
                                                        join bu in db.BranchUsers on bue.BranchUsersID equals bu.BranchUsersId
                                                        where bu.UserName == userName && gui.ViewTypeId == guiPermissionTypeId
                                                        && !gui.UnderlyingId.HasValue
                                                        && gui.SectorId.HasValue
                                                        && gui.ProductTypeId == productTypeId
                                                        select new PermissionValue { Id = gui.UnderlyingId.Value, Visible = gui.value }).ToList<PermissionValue>();

            var mergeList1 = MergeAndDistinctList(listUnderlyings, listUnderlyingsProductType);
            var mergeList2 = MergeAndDistinctList(mergeList1, listUnderlyingsProductGroup);
            var mergeList3 = MergeAndDistinctList(mergeList2, listUnderlyingsForSectors);
            var mergeList4 = MergeAndDistinctList(mergeList3, listUnderlyingsForSectorsProductType);
            var resultMergeList = MergeAndDistinctList(mergeList4, listUnderlyingsForSectorsProductGroup);

            return resultMergeList;

そして、これは私の MergeAndDistinctList 関数のコードです

 protected List<PermissionValue> MergeAndDistinctList(List<PermissionValue> listPrimary, List<PermissionValue> listSecondry)
    {
        List<PermissionValue> listMergedAndDistinct = new List<PermissionValue>();

        listMergedAndDistinct.AddRange(listPrimary);

        var filter = listPrimary.Select<PermissionValue, int>(p => p.Id);
        listMergedAndDistinct.AddRange(listSecondry.Where<PermissionValue>(p => !filter.Contains(p.Id)).Select(p => p));
        return listMergedAndDistinct;
    }

GetUnderlyingsForClient() コードに関する私の問題は、データベースに複数回ヒットすることです。このメソッドが頻繁にヒットすると、データベースへの複数回の呼び出しにつながる可能性があります。

このコードをより効率的にし、私がしなければならない DB 呼び出しの量を減らす方法を知っている人はいますか?

4

2 に答える 2

0

この単純化されたパターンに従ってクエリを実行できUnionます。

(from a in As where a.Id > 0 select a)
.Union(
from a in As where a.Name == "a" select a)
.Union(
...
)
.Select(a => new { a.x, a.y })
.Distinct()

これUnionは MergeAndDistinctList のマージ部分でありDistinct、ええと、個別の部分です。良い点は、 Distinct が投影に対して実行されることです(あなたの場合は Id と Visible )。

すべてが 1 つの (モンスター) クエリで実行される必要がありAddRange、MergeAndDistinctList によって引き起こされる中間の強制実行はありません。

あなたのクエリを見ると、いくつかの条件を組み合わせることで、より少数のクエリで実行できるように感じますが、それはあなた次第です。

于 2012-06-24T18:46:31.927 に答える
0

同じテーブルに対して多くのクエリを作成しているようです(あなたの場合は)

データベース クエリを制限するには、ローカル リストで必要なすべてのデータを取得し、このリストを次のように複数のクエリに使用できます。

var MyBaseList = db.A.ToList();

var listUnderlyings = (from a MyBaseList [...]
var listUnderlyingsProductGroup = (from a MyBaseList [...]

また、データの取得を制限するには、MyBaseList をフィルター処理して、次のクエリで使用される行のみを取得します。

于 2012-06-21T15:39:53.173 に答える