获取类型为类型数组的相关对象的列表

时间:2011-11-15 14:29:58

标签: c# linq

我有一个函数(通过ajax)我传递了一个Guid和逗号分隔string我希望返回的对象类型。我在构建仅返回所需类型的链接语句时遇到问题。我正在努力构建查询以检查string[] relatedTypes是否与rw.GetType().Name匹配。或许还有更好的方法。

这是模特......

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; }
}

这是我的功能

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;
}

4 个答案:

答案 0 :(得分:2)

您正在寻找类似的东西:

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();

虽然我会说以这种方式使用简单类型名称的集合并不是一个好习惯。你确定你不能在这里使用Type[]或类似的吗?

答案 1 :(得分:0)

从你的问题不清楚你到底想要什么,但我认为就是这样:

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

这会使用正确的WebObjects选择Id中的所有项目(我猜应该只有一个,但对查询无关紧要)。对于每个人,请获取其类型名称位于RelatedWebObjects的{​​{1}}。对于每个人,请获取他们的relatedWebObjectTypes

答案 2 :(得分:0)

您需要重构一下,而不是将类型的名称作为字符串传递,您应该传递实际类型,然后使用Linq运算符for OfType(Of RelatedType)

MSDN Article给出了一个简单的例子,可以让你在路上。

答案 3 :(得分:0)

有点晚了,但这就是我最终的目标...

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;
    }