【发布时间】:2013-09-04 15:38:48
【问题描述】:
我有以下三个生成的类,我正在尝试编写一个 linq-to-sql 查询来根据设置动态添加连接:
public class User
{
public int UserId { get; set; }
public string UserName { get; set; }
// ...
}
public class UserEmail
{
public int UserId { get; set; }
public string Address { get; set; }
// ...
}
public class UserPhone
{
public int UserId { get; set; }
public string PhoneNumber { get; set; }
// ...
}
这是对数据库执行的理想选择,但我可以从连接表中检索所有列:
// If includeEmail and includePhone are both true.
SELECT u.*, ue.Address, up.PhoneNumber
FROM users u
JOIN user_email ue ON u.user_id = ue.user_id
JOIN user_phone up ON u.user_id = up.user_id
// If includeEmail and includePhone are both false.
SELECT u.*
FROM users u
这是我正在使用的代码:
// Base query
var queryableUsers = m_context.Users.Where(u => u.UserId == 1).Select(u => u);
// Join to other tables based on settings
if (includeEmail)
{
Expression<Func<UserEmails, UserEmails>> emailSelector = (ue => ue.Address);
queryableUsers = queryableUsers.Join(m_context.UserEmails, u => u.UserId, ue => ue.UserId).Select(emailSelector);
}
if (includePhone)
{
Expression<Func<UserPhones, UserPhones>> phoneSelector = (up => up.PhoneNumber);
queryableUsers = queryableUsers.Join(m_context.UserPhones, u => u.UserId, up => up.UserId).Select(phoneSelector);
}
// Execute query
var results = queryableUsers.ToList();
【问题讨论】:
-
你的结果应该是
List<User>。但是User没有邮件和电话的属性。因此,您仍然只返回来自用户的数据。选择不会改变 -
对,我知道我的代码不正确,只是想让您了解我要做什么。基本上我正在尝试返回以下对象,但不知道如何引用我在选择中未执行子查询而添加的联接:new { User = u, Address = u.UserEmailList.Where(ue => ue.UserId == u.User_id).Select(ue => ue.Address).FirstOrDefault(), PhoneNumber = u.UserPhoneList.Where(up => up.UserId == u.UserId).Select(up => up.PhoneNumber ).FirstOrDefault() }
标签: c# sql linq linq-to-sql lambda