Linq to SQL クラスに、実際にはデータベースに存在しないプロパティがあります。
この列は 1 回のクエリでのみ入力します (つまり、ランク付けされた検索の場合)。
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 '%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')", "bull"
);
モデルの一部を次に示します。
/// <summary>
/// Unique identifier for a booking
/// </summary>
[DataMember]
[Column(DbType = "int", IsPrimaryKey = true, AutoSync = AutoSync.OnInsert, IsDbGenerated = true)]
public int? BookingID { get; set; }
/// <summary>
/// Search Ranking
/// </summary>
[DataMember]
[Column(DbType = "int")]
public int? SearchRank { get; set; }
ランク付けされた検索クエリに対してこれを実行すると、非常にうまく機能します。他のクエリを実行すると、存在しないため、「SearchRank フィールドが存在しません」というエラーが表示されます。データベースに SearchRank フィールドを配置すると、ランク付けされた検索を実行すると、フィールドは null に戻ります (おそらく、クエリの b.* 部分も SearchRank を返すためです。
モデルにある種の 'OptionalColumn' 属性を設定する方法はありますか?
それ以外の場合は、SearchRank 列を DB に配置してから、RankedSearch クエリの個々の列名を書き出す必要があります。