我一直在玩这个,因为它看起来感觉很像记录的帖子/用户示例,但它略有不同,并不适合我.
假设以下简化设置(联系人有多个电话号码):
public class Contact
{
public int ContactID { get; set; }
public string ContactName { get; set; }
public IEnumerable<Phone> Phones { get; set; }
}
public class Phone
{
public int PhoneId { get; set; }
public int ContactID { get; set; } // foreign key
public string Number { get; set; }
public string Type { get; set; }
public bool IsActive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望最终能够返回一个与多个Phone对象联系的东西.这样,如果我有2个联系人,每个联系人有2个电话,我的SQL将返回一个连接,作为结果集共4行.然后Dapper将弹出2个接触对象,每个接触对象有两部手机.
这是存储过程中的SQL:
SELECT *
FROM Contacts
LEFT …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用dapper-dot-net来加速我的asp.net mvc应用程序的某些区域.我也首先使用EF5代码.
由于dapper-dot-net只是IDbConnection的一些扩展,我可以使用
DbContext.Database.Connection
Run Code Online (Sandbox Code Playgroud)
用dapper-dot-net?我测试它是否有效.但是,我不确定这是使用它的正确方法吗?特别是,当我使用这种方式时,Entity Framework是否会产生一些可能会影响性能的影响?
实体 - AllSalesTerritory包含List<MySalesPerson>代表一对多关系.我有Sql查询来获取使用列映射两个实体的数据TerritoryId.我使用以下代码来填充实体Dapper micro ORM:
List<AllSalesTerritory> allSalesTerrotories = _connection.Query<AllSalesTerritory, MySalesPerson, AllSalesTerritory>
(query, (pd, pp) =>
{
pd.SalesPersons.Add(pp);
return pd;
}, splitOn: "BusinessEntityId")
.ToList();
Run Code Online (Sandbox Code Playgroud)
BusinessEntityId 是SalesPerson实体在执行Sql语句时的开始列
我面临的挑战是,这种代码有助于轻松填充一对一关系,这里我只获得一个值List<MySalesPerson>,而不是在集合中聚合这些值,基本上与SQL连接查询的结果相同.我可以使用简单的foreach循环并聚合值来轻松解决问题MySalesPerson.但是,我想弄明白:
SelectMany与具有一对多关系的实体有些相反我有以下 Dapper 查询:
var orderModels = db.Query<OrderModel>(@"
SELECT
o.[Id],
o.[CustomerId],
o.[DeliveryAddress_FirstName],
o.[DeliveryAddress_LastName],
o.[DeliveryAddress_Line1],
o.[DeliveryAddress_Line2],
o.[DeliveryAddress_City],
o.[DeliveryAddress_State],
o.[DeliveryAddress_PostCode],
o.[DeliveryAddress_Country],
o.[BillingAddress_FirstName],
o.[BillingAddress_LastName],
o.[BillingAddress_Line1],
o.[BillingAddress_Line2],
o.[BillingAddress_City],
o.[BillingAddress_State],
o.[BillingAddress_PostCode],
o.[BillingAddress_Country]
FROM
[Order] o
");
Run Code Online (Sandbox Code Playgroud)
我想将其加载到以下结构的数据模型中:
public class OrderModel
{
public int Id { get; set; }
public int CustomerId { get; set; }
public AddressModel DeliveryAddress { get; set; }
public AddressModel BillingAddress { get; set; }
}
public class AddressModel
{
public string FirstName { get; set; }
public string LastName { get; …Run Code Online (Sandbox Code Playgroud) 我需要使用 Dapper.net 将一对多扁平化 SQL 查询映射到嵌套对象中。
Slapper.Automapper 似乎是做到这一点的好方法;正如这个问题的答案中所详细说明的:
public string MrFlibble3()
{
using (var connection = new SqlConnection(Constr))
{
Slapper.AutoMapper.Cache.ClearInstanceCache();
const string sql = @"SELECT tc.[IDG] as ContactIdg
,tc.[ContactName] as ContactName
,tp.[Idg] AS TestPhones_PhoneIdg
,tp.[ContactIdg] AS TestPhones_ContactIdg
,tp.[Number] AS TestPhones_Number
FROM TestContact tc
INNER JOIN TestPhone tp ON tc.Idg = tp.ContactIdg";
// Step 1: Use Dapper to return the flat result as a Dynamic.
dynamic test = connection.Query<dynamic>(sql);
// Step 2: Use Slapper.Automapper for mapping …Run Code Online (Sandbox Code Playgroud) 我试图用Slapper.AutoMapper一起Dapper完成这样的事情:我怎样写一对多查询中Dapper.Net?.
我的POCO是这样的:
public class MyEntity
{
public string Name { get; set; }
public string Description { get; set; }
public int Level { get; set; }
public IList<int> Types { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我返回的数据库行是这样的:
因此,一个实体可以有多种类型.这就是我绘制内容的方式:
dynamic test = conn.Query<dynamic>(sql); Slapper.AutoMapper.Configuration.AddIdentifier(typeof(MyEntity), "Name");
var testContact = Slapper.AutoMapper.MapDynamic<MyEntity>(test);
Run Code Online (Sandbox Code Playgroud)
但是在我的所有结果对象中,Types属性为null.如何将所有Type值映射到IList类型?