bflemi3
bflemi3

Reputation: 6790

Get list of related objects whose type is in array of types

I have a function that (via ajax) I pass a Guid and a comma delimited string of the types of objects I would like to return . I'm having trouble building a link statement that only returns the desired types. I'm struggling with how to build the query to check if string[] relatedTypes matches rw.GetType().Name. Or perhaps there's a better way.

Here's the Model...

public abstract class WebObject : IValidatableObject
{
    public WebObject()
    {
        this.Id = Guid.NewGuid();
        RelatedTags = new List<Tag>();
        RelatedWebObjects = new List<WebObject>();
    }

    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid Id { get; set; }
    public virtual ICollection<WebObject> RelatedWebObjects { get; set; }
    public IList<Guid> RelatedWebObjectIds { get; set; }
}

And here's my function

public JsonResult GetRelatedWebObjectsByWebObject(Guid id, string relatedWebObjectTypes)
{
    JsonResult result = new JsonResult();
    Guid webSiteId = db.WebObjects.Find(id).WebSiteId;
    string[] relatedTypes = relatedWebObjectTypes.Split(',');
    var resultData = (from w in db.WebObjects
                      where w.Id == id
                      from rw in w.RelatedWebObjects
                      where rw.GetType().Name.Contains(relatedTypes)
                      select rw.Id).ToList();

    result.Data = resultData;
    result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
    return result;
}

Upvotes: 3

Views: 218

Answers (4)

bflemi3
bflemi3

Reputation: 6790

A little late, but here's what I ended up going with...

public JsonResult GetRelatedWebObjectsByWebObject(Guid id, string relatedWebObjectTypes)
    {
        JsonResult result = new JsonResult();
        Guid webSiteId = db.WebObjects.Find(id).WebSiteId;

        List<string> relatedTypes = new List<string>(relatedWebObjectTypes.Split(','));
        var resultData = (from w in db.WebObjects
                          where w.Id == id
                          from rw in w.RelatedWebObjects
                          select rw).ToList();

        result.Data = resultData.Where(w => relatedTypes.Contains(w.GetType().BaseType.Name) == true).Select(w => new { Id = w.Id, Type = w.GetType().BaseType.Name }).ToList();//w.Id).Select(w => w.GetType().BaseType.Name).ToList();
        result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        return result;
    }

Upvotes: 0

Gent
Gent

Reputation: 2685

You would need to refactor a bit, instead of passing in the name of the types as string, you should pass the actual type then use the linq operator for OfType(Of relatedType)

The MSDN Article gives a simple example that should have you on your way.

Upvotes: 0

svick
svick

Reputation: 244998

It's not clear from your question what exactly do you want, but I think it's this:

from w in db.WebObjects
where w.Id == id
from rw in w.RelatedWebObjects
where relatedWebObjectTypes.Contains(rw.GetType().Name)
select rw.Id

This selects all the items from WebObjects with the correct Id (I guess there should be only one, but it does not matter to the query). And for each of them, get the RelatedWebObjects whose type's name is in relatedWebObjectTypes. And for each of those, get their Id.

Upvotes: 0

Ani
Ani

Reputation: 113462

Are you looking for something like:

var relatedTypes = new HashSet<string>(relatedWebObjectTypes);
var resultData = (from w in db.WebObjects
                  where w.Id == id
                    &&  relatedTypes.SetEquals
                          (w.RelatedWebObjects.Select(rwo => rwo.GetType().Name))

                  select w.RelatedWebObjectIds).ToList();

Although I would say that it isn't good practice to use a collection of simple type names in this manner. Are you sure you couldn't use a Type[] or similar here?

Upvotes: 2

Related Questions