我有以下列表
List<int> toExclude = new List<int>(); //Assume I have number between 1-10
List<ReportObjectRelation> relations = new List<ReportObjectRelation>(); //Assume I have multiple `ReportObjectRelation` objects in this list
我需要提取relations
的列表,其中CurrentObjectId = 6
和RemoteObjectId
不在toExclude
列表中。
这是我的ReportObjectRelation
对象
public class ReportObjectRelation
{
//Relation
public int Id { get; set; }
public string DisplayName { get; set; }
public string Alias { get; set; }
//Local Object
public int CurrentObjectId { get; set; }
public string CurrentObjectName { get; set; }
public int ForeignPropertyId { get; set; }
public string ForeignProperty { get; set; }
//Remote Object
public int RemoteObjectId { get; set; }
public string RemoteObjectName { get; set; }
public int LocalPropertyId { get; set; }
public string RemoteProperty { get; set; }
}
这是我试过的
var f = allRelations.Where(x => x.CurrentObjectId == 6 && !toExceule.Exists(x.RemoteObjectId) ).ToList();
但是这给了我以下错误
不能使用ref out参数toExceule
匿名方法,lambda表达式或查询表达式。
如何正确提取CurrentObjectId == 6
中RemoteObjectId
和toExceule
不在[1,2,[2,3],[5,[6,1],4],7]
的关系列表?
答案 0 :(得分:1)
您不能在匿名方法中使用out参数。您需要先将其分配给局部变量。 (我真的不知道为什么你在这种情况下使用输出参数,因为你没有显示整个代码):
var copyOfList = toExceule;
var f = allRelations.Where(x => x.CurrentObjectId == 6
&& !copyOfList .Contains(x.RemoteObjectId)).ToList();
如果您想使用Exists,可以尝试以下方法:
var f = allRelations.Where(x => x.CurrentObjectId == 6
&& !copyOfList.Exists(y=> y == x.RemoteObjectId)).ToList();
这个技巧纯粹是因为lambda表达式改变了局部变量的生命周期。
答案 1 :(得分:1)
List.Exists
采用谓词,即对列表中的项目返回true或false的委托,而不是项目本身。
你想要List.Contains
,它会使一个项目返回true或false,具体取决于它是否在列表中。
var f = allRelations.Where(x => x.CurrentObjectId == 6
&& !toExclude.Contains(x.RemoteObjectId)).ToList();
有关正常工作的演示,请参阅this fiddle。
答案 2 :(得分:0)
如果您不想使用Exists
方法,可以尝试这样的事情:
var f = allRelations.Where(x => x.CurrentObjectId == 6
&& !toExclude.Contains(x.RemoteObjectId))
.ToList();
另一方面,您可以使用Exists
。但是,此方法需要谓词。
var f = allRelations.Where(x => x.CurrentObjectId == 6
&& !toExclude.Exists(te => te == x.RemoteObjectId))
.ToList();
有关后者的更多信息,请查看here。
答案 3 :(得分:0)
var f = allRelations.Where(x => x.CurrentObjectId == 6
&& !toExceule.Any(a=>a==x.RemoteObjectId) )
.ToList();
你可以使用.Any()
这将在toExceule中检查是否== RemoteObjectId
答案 4 :(得分:0)
在LINQ Query之后,将拉出当前对象id等于6并且其远程对象id不等于包含在toExclude List中的所有关系列表。
var result = relations.Where(r => r.CurrentObjectId == 6 && !toExclude.Any(t => t == r.RemoteObjectId)).ToList();