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行の長さでした!
ランク付けされた検索ビオラ!