帮助构建具有连接的LINQ2SQL查询

时间:2011-06-25 22:08:31

标签: linq-to-sql

我有这个:

var q = (from order in db.Orders
                        from payment in db.Payments
                        .Where(x => x.ID == order.paymentID)
                        .DefaultIfEmpty()
                        from siteUser in db.SiteUsers
                        .Where(x => x.siteUserID == order.siteUserID)
                        .DefaultIfEmpty()
                        where siteUser.siteUserID != null
                                                select new
                        {
                            order.orderID,
                            order.dateCreated,
                            payment.totalAmount,
                            siteUser.firstName,
                            siteUser.lastName
                        });

我想像这样添加:

switch (_qs["sort"])
            {
                case "0":
                    q = q.OrderByDescending(x => x.dateCreated);
                    break;
                case "1":
                    q = q.OrderBy(x => x.dateCreated);
                    break; ...

我之前使用单个表完成了这个,但是第一个代码块中的多个表强制我指定一个select语句,使其成为匿名类型。如何才能做到这一点?

注意:我甚至尝试使用我正在选择的属性创建一个类并将查询强制转换为此类型,但仍然不行。

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解这个问题,但您粘贴的代码看起来对我有用。

我查了一下:

var q = (
    from order in db.Orders
    join payment in db.Payments on
        order.paymentID equals payment.ID into payments
    from payment in payments.DefaultIfEmpty()
    join siteUser in db.SiteUsers on
        order.siteUserID equals siteUser.siteUserID into siteUsers
    from siteUser in siteUsers.DefaultIfEmpty()
    where siteUser.siteUserID != null
    select
        new
        {
            order.orderID,
            order.dateCreated,
            payment.totalAmount,
            siteUser.firstName,
            siteUser.lastName
        });
switch (sort)
{
    case "0":
        q = q.OrderByDescending(x => x.dateCreated);
        break;
    case "1":
        q = q.OrderBy(x => x.dateCreated);
        break;
}
var restult = q.ToList();

这很有效。