LINQ查询表达式和扩展方法

时间:2010-08-25 10:58:23

标签: c# linq query-expressions

如何使用扩展方法创建此表达式,但(!)不使用匿名类型?

from p in posts
               join u in context.oxite_Users on p.CreatorUserID equals u.UserID
               join pa in context.oxite_PostAreaRelationships on p.PostID equals pa.PostID
               join a in context.oxite_Areas on pa.AreaID equals a.AreaID
               let c = getCommentsQuery(p.PostID)
               let t = getTagsQuery(p.PostID)
               let tb = getTrackbacksQuery(p.PostID)
               let f = getFilesQuery(p.PostID)
               where p.State != (byte)EntityState.Removed
               orderby p.PublishedDate descending
               select new Post
               { area = a, comments = c } e.t.c.

1 个答案:

答案 0 :(得分:2)

这里的关键是引入一个元组,它封装了连接操作和其他let的组合状态。我不能仅仅根据那个来重复你的环境,但是这里有一个有限的例子,应该清楚(ish);

using System.Linq;
static class Program
{
    static void Main()
    {
        var users = new User[0]; // intentionally 0; only exists to prove compiles
        var orders = new Order[0];

        var query = users.Join(orders, user => user.UserId, order => order.OrderId, (user,order) => new UserOrderTuple(user,order))
            .Where(tuple => tuple.State != 42).OrderByDescending(tuple => tuple.Order.OrderId)
            .Select(tuple => new ResultTuple { Comment = tuple.Comment });
    }
}

class ResultTuple
{
    public string Comment { get; set; }
}
class UserOrderTuple
{
    public UserOrderTuple(User user, Order order)
    {
        User = user;
        Order = order;
        Comment = "some magic that gets your comment and other let";
        State = 124;
    }
    public string Comment { get; private set; }
    public int State { get; private set; }
    public User User { get; private set; }
    public Order Order { get; private set; }
}
class User
{
    public int UserId { get; set; }
}
class Order
{
    public int UserId { get; set; }
    public int OrderId { get; set; }
}