我有一个函数(通过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;
}
答案 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;
}