C# 使用dapper c填充列表对象
我的数据库中有两个表,如下所示: 我有一门课:C# 使用dapper c填充列表对象,c#,list,object,fill,dapper,C#,List,Object,Fill,Dapper,我的数据库中有两个表,如下所示: 我有一门课: class Ean { public string Code{ get; set; } } class Article { public int Id { get; set; } public string Name { get; set; } public List<Ean> BarCode { get; set; } } List
class Ean
{
public string Code{ get; set; }
}
class Article
{
public int Id { get; set; }
public string Name { get; set; }
public List<Ean> BarCode { get; set; }
}
List<Article> arts = new List<Article>();
在c
arts = conn.Query<Article>(query, null, transaction).ToList();
但是不要工作。我该怎么办?谢谢。。欢迎提出任何建议 试试这个,我想可以
arts = conn.Query<Article>(query).ToList();
看看Dapper的功能
Dapper允许您将一行映射到多个对象。这是一个
关键功能,如果您想避免额外的查询和急切的加载
协会
例如:
var sql =
@"select * from #Posts p
left join #Users u on u.Id = p.OwnerId
Order by p.Id";
var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post;});
var post = data.First();
post.Content.IsEqualTo("Sams Post1");
post.Id.IsEqualTo(1);
post.Owner.Name.IsEqualTo("Sam");
post.Owner.Id.IsEqualTo(99);
重要提示Dapper假设您的Id列命名为Id或Id,
如果您的主键不同,或者您希望拆分宽
行在Id以外的点处,使用可选的“splitOn”参数
另一种解决方案,其优点是只使用一个请求、两行代码,并且可以将连接示例链接到三个表: 覆盖每个域对象的Equals和GetHashCode这可以通过继承自动完成 将两个扩展名添加到其父行,以影响子行 请求:
var data = connection.Query<Table1, Table2, Table3, Table3>(
@" SELECT * FROM Table1
LEFT JOIN Table2 ON Table1.Id = Table1Id
LEFT JOIN Table3 ON Table2.Id = Table2Id
WHERE Table1.Id IN @Ids",
(t1, t2, t3) => { t2.Table1 = t1; t3.Table2 = t2; return t3; },
param: new { Ids = new int[] { 1, 2, 3 });
var read = data.GroupBy(t => t.Table2).DoItForEachGroup(gr => gr.Key.Table3s.AddRange(gr)).Select(gr => gr.Key).
GroupBy(t => t.Table1).DoItForEachGroup(gr => gr.Key.Table2s.AddRange(gr)).Select(gr => gr.Key);
域对象:
public class Table1
{
public Table1()
{
Table2s = new List<Table2>();
}
public Guid Id { get; set; }
public IList<Table2> Table2s { get; private set; }
public override bool Equals(object obj)
{
if (obj as Table1 == null) throw new ArgumentException("obj is null or isn't a Table1", "obj");
return this.Id == ((Table1)obj).Id;
}
public override int GetHashCode()
{
return this.Id.GetHashCode();
}
}
public class Table2
{
public Table2()
{
Table3s = new List<Table3>();
}
public Guid Id { get; set; }
public Guid Table1Id
{
get
{
if (Table1 == null)
return default(Guid);
return Table1.Id;
}
}
public IList<Table3> Table3s { get; private set; }
public Table1 Table1 { get; set; }
public override bool Equals(object obj)
{
if (obj as Table2 == null) throw new ArgumentException("obj is null or isn't a Table2", "obj");
return this.Id == ((Table2)obj).Id;
}
public override int GetHashCode()
{
return this.Id.GetHashCode();
}
}
public class Table3
{
public Table3()
{
}
public Guid Id { get; set; }
public Guid Table2Id
{
get
{
if (Table2 == null)
return default(Guid);
return Table2.Id;
}
}
public Table2 Table2 { get; set; }
public override bool Equals(object obj)
{
if (obj as Table3 == null) throw new ArgumentException("obj is null or isn't a Table3", "obj");
return this.Id == ((Table3)obj).Id;
}
public override int GetHashCode()
{
return this.Id.GetHashCode();
}
}
扩展:
public static class CollectionExtensions
{
public static void AddRange<T>(this IList<T> that, IEnumerable<T> collection)
{
if (that == null)
throw new ArgumentNullException("that", "that is null.");
if (collection == null)
throw new ArgumentNullException("collection", "collection is null.");
if (that is List<T>)
{
((List<T>)that).AddRange(collection);
return;
}
foreach (T item in collection)
that.Add(item);
}
public static IEnumerable<IGrouping<TKey, TElem>> DoItForEachGroup<TKey, TElem>(this IEnumerable<IGrouping<TKey, TElem>> group, Action<IGrouping<TKey, TElem>> action)
{
if (group == null)
throw new ArgumentNullException("group", "group is null.");
if (action == null)
throw new ArgumentNullException("action", "action is null.");
group.ToList().ForEach(gr => action(gr));
return group;
}
}
这和我做的一样,但问题是如何填写条形码列表,因为查询。。。EAN.EAN作为条形码不要填充它!我该怎么办?@enzop92我想您在条形码中得到的是空值。@enzop92还可以请arts=conn.Queryquery,articles,eans=>{articles.Article=articles;return eans;}splitOn:Code;托利斯特先生;你不可能一蹴而就。看,这里应该使用内部连接,而不是交叉连接。我认为这不是正确的答案,因为在这个示例中,所有者变量是用户对象,而不是列表。如何在对象中填写列表?事情正好相反,若用户对象中有一个帖子列表,那个么我们如何填写帖子列表呢?我找到了正确的答案。
public class Table1
{
public Table1()
{
Table2s = new List<Table2>();
}
public Guid Id { get; set; }
public IList<Table2> Table2s { get; private set; }
public override bool Equals(object obj)
{
if (obj as Table1 == null) throw new ArgumentException("obj is null or isn't a Table1", "obj");
return this.Id == ((Table1)obj).Id;
}
public override int GetHashCode()
{
return this.Id.GetHashCode();
}
}
public class Table2
{
public Table2()
{
Table3s = new List<Table3>();
}
public Guid Id { get; set; }
public Guid Table1Id
{
get
{
if (Table1 == null)
return default(Guid);
return Table1.Id;
}
}
public IList<Table3> Table3s { get; private set; }
public Table1 Table1 { get; set; }
public override bool Equals(object obj)
{
if (obj as Table2 == null) throw new ArgumentException("obj is null or isn't a Table2", "obj");
return this.Id == ((Table2)obj).Id;
}
public override int GetHashCode()
{
return this.Id.GetHashCode();
}
}
public class Table3
{
public Table3()
{
}
public Guid Id { get; set; }
public Guid Table2Id
{
get
{
if (Table2 == null)
return default(Guid);
return Table2.Id;
}
}
public Table2 Table2 { get; set; }
public override bool Equals(object obj)
{
if (obj as Table3 == null) throw new ArgumentException("obj is null or isn't a Table3", "obj");
return this.Id == ((Table3)obj).Id;
}
public override int GetHashCode()
{
return this.Id.GetHashCode();
}
}
public static class CollectionExtensions
{
public static void AddRange<T>(this IList<T> that, IEnumerable<T> collection)
{
if (that == null)
throw new ArgumentNullException("that", "that is null.");
if (collection == null)
throw new ArgumentNullException("collection", "collection is null.");
if (that is List<T>)
{
((List<T>)that).AddRange(collection);
return;
}
foreach (T item in collection)
that.Add(item);
}
public static IEnumerable<IGrouping<TKey, TElem>> DoItForEachGroup<TKey, TElem>(this IEnumerable<IGrouping<TKey, TElem>> group, Action<IGrouping<TKey, TElem>> action)
{
if (group == null)
throw new ArgumentNullException("group", "group is null.");
if (action == null)
throw new ArgumentNullException("action", "action is null.");
group.ToList().ForEach(gr => action(gr));
return group;
}
}