2

拡張メソッドを使用してこの式を作成する方法はありますが、(!) 匿名型は使用しませんか?

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.
4

1 に答える 1

2

ここで重要なのは、結合操作とその他letの結合状態をカプセル化するタプルを導入することです。それだけであなたの環境を再現することはできませんが、それを明確にする必要がある限定的な例を次に示します。

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; }
}
于 2010-08-25T11:13:27.673 に答える