我刚开始研究Dapper.net并尝试使用一些不同的查询,其中一个查询产生了奇怪的结果,让我感到意外。
我有两张表 - Photos
和 PhotoCategories
,它们之间通过CategoryID
进行关联。
Photos表
PhotoId (PK - int)
CategoryId (FK - smallint)
UserId (int)
照片分类表
CategoryId (PK - smallint)
CategoryName (nvarchar(50))
我的两个类:
public class Photo
{
public int PhotoId { get; set; }
public short CategoryId { get; set; }
public int UserId { get; set; }
public PhotoCategory PhotoCategory { get; set; }
}
public class PhotoCategory
{
public short CategoryId { get; set; }
public string CategoryName { get; set; }
{
我希望使用多重映射来返回一个
Photo
实例,并填充相关的PhotoCategory
实例。var sql = @"select p.*, c.* from Photos p inner
join PhotoCategories c
on p.CategoryID = c.CategoryID where p.PhotoID = @pid";
cn.Open();
var myPhoto = cn.Query<Photo, PhotoCategory, Photo>(sql,
(photo, photoCategory) => { photo.PhotoCategory = photoCategory;
return photo; },
new { pid = photoID }, null, true, splitOn: "CategoryID").Single();
当执行此代码时,尽管数据库表和对象中具有相同的名称,但并非所有属性都被填充。
我注意到如果在我的SQL中不选择“select p.*等”,而是明确指定字段,则会填充所有内容。
我想从查询结果中排除CategoryId,然后所有其他内容都会被填充(当然,我已经在select语句中排除了Photo对象的CategoryId)。
但我希望能够在查询中包含该字段,并且查询中的所有其他字段以及CategoryId都能被填充。
我可以将Photo类中的CategoryId属性排除在外,每当需要ID时都使用Photo.PhotoCategory.CategoryId。
但在某些情况下,当我获取Photo对象实例时,可能不想填充PhotoCategory对象。
有人知道为什么会出现上述行为吗?这对于Dapper来说正常吗?
PhotoCategory
对象...在这种情况下,您当然可以始终创建虚拟的PhotoCategory
对象并设置它们的Id
。 当我只需要传递标识符时但我的方法需要对象实例时,我经常这样做。 - Robert Koritnik