1

ActiveRecord から Dapper に切り替えています。いくつかのフィールドを持つ単純な Project クラスがあります。

  • ID (整数)
  • 名前 (文字列)
  • シークレット (ガイド)
  • OwnerId (ガイド)

Dapper を使用する最初の試みは、次のコードになりました。私は Dapper を次のように使用しています。

List<Project> projects = new List<Project>();
using (var conn = MvcApplication.GetSqlConnection()) // new connection
{
    projects = conn.Query<Project>("SELECT * FROM Projects p WHERE p.OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();
}
return View(projects);

このクエリの結果はDataException: Error parsing column 0 (Id=11 - Int16). 内部例外はInvalidCastException: Specified cast is not valid.

Dapper の使用ページに記載されているサンプルがないSELECT *ため、次のようにクエリを修正しようとしました。

    projects = conn.Query<Project>("SELECT OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();

デバッグすると、DB に 2 つのプロジェクトがありますが、返されるのは 1 つだけです。その名前には null があります。

変。私は何を間違っていますか?Dapper がフィールド (DB) をフィールド (クラス) に適切にマッピングしていないように感じます。最新の NuGet バージョンを使用しています。

4

2 に答える 2

1

あなたが見ている違いは、次の (1.12?) リリースの重要な機能です。歴史的に、dapper はデータが完全に一致する必要があることに非常にうるさいです。たとえば、データが double であるがフィールド/プロパティが float である場合、またはデータが long でフィールド/プロパティが int である場合は、不平を言う (スローする) でしょう。 . 保留中のバージョンでは、これを検出し、生成された IL の一部として補正する追加のコードがあります(Convert.ChangeType 経由ではありません - 遅すぎます)。

この変更の主な要因の 1 つは、一部のデータベースがかなり単純な値を非常に異なる方法で返すことです。一部のデータベースのユーザーが自分のタイプをマップするのはしばしば問題でした。

Tl;dr: 新しい機能が役に立ってうれしいです。すぐにリリースされるはずです。

于 2012-09-18T17:06:47.933 に答える
0

Dapper は SQL の結果のみをマップするため、マップするテーブルから選択する必要があります。

List<Project> projects = new List<Project>();
using (var conn = MvcApplication.GetSqlConnection()) // new connection
{
    projects = conn.Query<Project>("SELECT * FROM Projects Where OwnerId = (SELECT UserId FROM aspnet_Users WHERE LoweredUserName=@userName)", new { userName = User.Identity.Name.ToLower() }).ToList();
}
return View(projects);

于 2012-09-18T09:48:32.913 に答える