用线加入导航属性

时间:2013-03-23 23:38:07

标签: c# linq dapper

我尝试使用LINQ加入导航属性。 这是我的代码

    var activities = Using<GetActivitiesForUser>()
        .Execute(User.DisplayAs, User.MarketId);

    var contacts = Using<GetContactsForUser>()
        .Execute(User.DisplayAs, User.MarketId);

    var model = from activity in activities
                join contact in contacts
                on activity.ContactId equals contact.ContactId
                select activity; 

此代码仅选择没有任何连接的活动。 该活动有一个名为Contact的属性,我想从Contacts中加入该属性。

更新

解决问题的例子

foreach(var activity in activities)
{
activity = from contact in contacts
where contact.ContactId=activity.ContactId
select contact
}

但我想通过加入来做到这一点。

2 个答案:

答案 0 :(得分:1)

看起来您正在使用实体框架

var model = activities.Include("Contact");

答案 1 :(得分:1)

您必须在查询结果中包含活动和联系人:

from activity in activities
join contact in contacts
on activity.ContactId equals contact.ContactId
select new { activity, contact }; 

或选择两个对象的各个属性。

修改评论后:

你将无法让Dapper填充activity.contact,故意保持简单。你可以做的是遍历结果并自己设置属性:

foreach(var anon in model)
{
    anon.activity.contact = anon.contact;
}

其中model是查询.ToList()

另一种有效但丑陋的方式可能是:

model.Select(x => { x.activity.contact = x.contact; return activity; }).ToList();

立即返回修改后的活动。它很难看,因为它滥用了一种无状态的方法(Select),但是是的......