1

linqクエリを作成しようとしていますが、groupbyのパフォーマンスが非常に遅いため、代わりにSQLでクエリを作成しました。これは非常に高速ですが、linqpadを使用してlinqに変換することはできません。このSQLをLinqに変換するのに役立つボディはありますか?

(SELECT mm.rcount, * FROM
(SELECT m.TourID AS myId, COUNT(m.RecordType) AS rcount FROM
(
((SELECT *
FROM Bookings h
WHERE h.RecordType = 'H' AND h.TourArea like '%bull%')
union
(SELECT *
FROM Bookings t
WHERE t.RecordType = 'T' and t.TourGuideName like '%bull%'))
) m
group by m.TourID) mm
INNER JOIN Bookings b ON mm.myId= b.TourID
WHERE b.RecordType = 'H');

これが私のLINQの取り組みですが、200を超えるレコードを反復処理するのに20秒ほどかかります。

        var heads = from head in db.GetTable<BookingType>()
                    where head.RecordType == "H" &&
                    head.TourArea.Contains("bull")
                    select g;

        var tgs = from tourguides in db.GetTable<BookingType>()
                  where tourguides.RecordType == "T" &&
                  tourguides.TourGuideName.Contains("bull")
                  select tourguides;

        var all = heads.Union(tgs);
        var groupedshit = from r in all
                          group r by r.BookingID into g
                          select g;

        return heads;

編集1: これが私のデータベース構造です:

BookingID [PK] | TourID | RecordType | TourArea | TourGuideName | ALoadOfOtherFields

そして、ここにいくつかのサンプルデータがあります:

1 | 1 | H | 闘牛場| ヌル

2 | 1 | T | null | ブルドッグ

3 | 2 | H | 闘牛場| ヌル

4 | 2 | T | null | ブルドッグ

5 | 2 | T | null | ブルスタンプ

H(ヘッド)レコードは1つだけですが、T(ツアーガイド)レコードが多数ある可能性があります。グループ化した後、.Count()を使用して.Contains('bull')で新しい(この質問のように:LINQ to SQLを使用してランク付けされた検索結果を作成する方法は? )を選択すると、ランク付けされた検索を取得できます(この演習の要点)。

編集2: 結果をキーと値のペアに変換する問題を回避するために、クラス自体に検索ランクのプロパティを追加しました。これがベストプラクティスかどうかはわかりませんが、機能します。

    /// <summary>
    /// Search Ranking
    /// </summary>
    public int? SearchRank { get; set; }

次に、linq-to-sqlを使用してSQLクエリを直接実行します。

        IEnumerable<BookingType> results = db.ExecuteQuery<BookingType>
        ("(SELECT  mm.rcount AS SearchRank, b.* FROM (SELECT m.TourID AS myId, COUNT(m.RecordType) AS rcount FROM (((SELECT * FROM Bookings h WHERE h.RecordType = 'H' AND h.TourArea like '%{0}%') union (SELECT * FROM Bookings t WHERE t.RecordType = 'T' and t.TourGuideName like '%{0}%')) ) m group by m.TourID) mm INNER JOIN Bookings b ON mm.myId= b.TourID WHERE b.RecordType = 'H')", "bull");

Linq-to-sqlをメンタルにすることなく、「AND」と「OR」を好きなだけ追加できます(生成されたクエリは200行の長さでした!

ランク付けされた検索ビオラ!

4

2 に答える 2

2

使用する必要はまったくありませんunionWhere OR AND次のようなもの を使用できます。

 var result=    from b in DB.GetTable<Booking>()
                where (b.recordType =="H" || b.recordType=="T") 
                       &&b.TourArea.Contains("bull")
                group b by b.Booking_Id into g
                select g;
于 2012-11-16T17:14:23.100 に答える
1

なぜわざわざ変換するのですか?最適化したSQlを呼び出すことができます。

于 2012-11-18T20:55:17.560 に答える