Domanda

Come rendere questa espressione utilizzando i metodi di estensione, ma (!) Che non utilizzano i tipi anonimi?

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.
È stato utile?

Soluzione

La chiave qui è quello di introdurre una tupla che incapsula lo stato combinato delle operazioni e degli altri lets join. Non posso repro vostro ambiente proprio da questo, ma qui è un esempio limitata che dovrebbe mettere in chiaro (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; }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top