3

Linqクエリが1つあります。クエリを実行すると、モデルにデータを抽出するのに13秒かかる10のレコードのみが記録されます。私が書いたクエリがパフォーマンスに良いかどうかを知る必要があります。私が間違っていることを教えてください。

コード

    var stocktakelist = (from a in Db.Stocktakes
                             select new ExportStock
                                 {
                                     Id = a.Id,
                                     ItemNo = a.ItemNo,
                                     AdminId = (from admin in Db.AdminAccounts where admin.Id == a.Id select admin.Name).FirstOrDefault(),
                                     CreatedOn = a.CreatedOn,
                                     Status = (from items in Db.Items where items.ItemNo == a.ItemNo select items.ItemStatu.Description).FirstOrDefault(),
                                     Title = (from tit in Db.BibContents where tit.BibId == (from bibs in Db.Items where bibs.ItemNo == a.ItemNo select bibs.BibId).FirstOrDefault() && tit.TagNo == "245" && tit.Sfld == "a" select tit.Value).FirstOrDefault()   // This line of Query only makes the performance Issue
                                 }
            ).ToList();

ありがとう

4

4 に答える 4

2

これが非常に遅い理由は、外部LINQステートメントのすべてのアイテムに対して3つの内部LINQステートメントを実行しているためです。LINQ結合を使用すると、4つのクエリのみが実行され、それらがリンクされます。これはより高速です。

参加方法については、使用しているLINQの種類に応じて、インターネット上にたくさんのリソースがあります。

このデータをSQLサーバーから取得する場合は、SQLでこの集中的な作業を行うことを検討してください。これは、SQLが設計された目的であり、.NETよりもはるかに高速です。編集:以下で強調表示されているように、 SQL /エンティティへのLINQを使用し、正しい結合構文を使用している場合、作業はSQLで行われます。

于 2013-01-04T13:20:03.577 に答える
1

練習のために、いくつかの結合を使用して対応するクエリを作成しようとしていました。私はそれをテストすることはできず、このクエリがあなたが望んでいる結果を得るとは100%確信していませんが、少なくともlinqで結合を書く方法についてのヒントを与えるでしょう.

from a in Db.Stocktakes

join admin in Db.AdminAccounts
  on a.Id equals admin.Id
into adminJoinData
from adminJoinRecord in adminJoinData.DefaultIfEmpty( )

join items in Db.Items
  on a.ItemNo equals items.ItemNo
into itemsJoinData
from itemsJoinRecord in itemsJoinData.DefaultIfEmpty( )

join title in Db.BibContents
   (
       from subQuery in Db.BibContents
       where subQuery.TagNo == "245"
       where subQuery.Sfld == "a"
       select subquery
   )
  on title.BibId equals itemsJoinRecord.BidId
into titleJoinData
from titleJoinRecord in titleJoinData.DefaultIfEmpty( )

select new ExportStock( )
{
    Id = a.Id,
    ItemNo = a.ItemNo,
    AdminId = adminJoinRecord.Name,
    CreatedOn = a.CreatedOn,
    Status = itemsJoinRecord.ImemStatu.Description,
    Title = titleJoinRecord.Value
}
于 2013-01-04T13:33:42.537 に答える
1

他の人が言ったように、SQL で記述する場合と同様に、LINQ でLeft Outer Joinsを使用する必要があります。

上記のクエリは、変換されると大まかに次のようになります (これはテストされていませんが、基本的な考え方はわかります)。

var a = from a in Db.Stocktakes
    join admin in Db.AdminAccounts on admin.Id equals a.Id into tmpAdmin
    from ad in tmpAdmin.DefaultIfEmpty()
    join item in Db.Items on item.ItemNo equals a.ItemNo into tmpItem

    from it in tmpItem.DefaultIfEmpty()
    join title in Db.BibContents on bib.BibId equals items.BibId into tmpTitle

    from ti in tmpTitle.DefaultIfEmpty()
    where ti.TagNo == "245" 
        && ti.Sfld == "a"
    select new ExportStock
    {
        Id = a.Id,
        ItemNo = a.ItemNo,
        AdminId = ad == null ? default(int?) : ad.Id,
        CreatedOn = a.CreatedOn,
        Status = it == null ? default(string) : it.ItemStatus.Description,
        Title = ti == null ? default(string) : ti.Value
    };
于 2013-01-04T13:30:53.170 に答える
0

ラムダ式を使用すると、クエリは次のようになります。

        Db.Stocktakes
            .Join(Db.AdminAccounts, a => a.Id, b => b.Id, (a,b) => new { a, AdminId = b.Name })
            .Join(Db.Items, a => a.ItemNo, b => b.ItemNo, (a,b) => new { a, Status = b.ItemStatus.Description, BidId = b.BibId })
            .Join(Db.BibContents, a => a.BibId, b => b.BibId, (a,b) => new { a, Value = b.Value, TagNo = b.TagNo, Sfld = b.Sfld })
            .Where(a => a.TagNo == "245" && a.Sfld == "a")
            .Select(a => 
                new ExportStock { Id = a.Id, 
                                  ItemNo = a.ItemNo,
                                  AdminId = a.AdminId,
                                  CreatedOn = a.CreatedOn,
                                  Status = a.Status,
                                  Title = a.Value
                }
            ).ToList();
于 2013-01-04T13:51:32.620 に答える