获取类型在类型数组中的相关对象的列表
本文关键字:对象 列表 取类型 类型 数组 获取 | 更新日期: 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;
}