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

本文关键字:对象 列表 取类型 类型 数组 获取 | 更新日期: 2023-09-27 18:14:46

我有一个函数(通过ajax),我传递了我想返回的对象类型的Guid和逗号分隔的string。我有麻烦建立一个链接语句,只返回所需的类型。我正在努力建立查询来检查string[] relatedTypes是否与rw.GetType().Name匹配。或许还有更好的办法。

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

这是函数

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

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

您是否在寻找如下内容:

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[]或类似的吗?

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

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(我猜应该只有一个,但它并不重要的查询)。对于它们中的每一个,获取类型名称在relatedWebObjectTypes中的RelatedWebObjects。对于每一个,得到它们的Id

您需要重构一点,而不是将类型的名称作为字符串传递,您应该传递实际类型,然后使用linq操作符OfType(of relatedType)

MSDN文章给出了一个简单的例子,你应该在你的方式。

有点晚了,但这是我最终的结果…

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