我有一个包含模型的列表,其中每个模型都有一个数字。
现在我想搜索另一个包含其他模型的列表,其中每个模型都可能包含第一个列表中的数字。
这就是我的模型的样子:
public class Task
{
int AddressId; //foreign key
}
public class Address
{
int Id; //primary key
}
现在我有一份地址列表和一系列任务。 我想将我的任务列表过滤到只有AddressId在我的地址列表中的那些任务。
我的linq怎么样?
result = tasks.Where(t => t.AddressId == ???)
答案 0 :(得分:0)
查看Join
from m in model1s
join n in model2s on m.Id equals n.Fk
select n
如果您不知道,要将它们放入数组:
var model1s = new[] { model1A, model1B, model1C };
var model2s = new[] { model2A, model2B, model2C };
答案 1 :(得分:0)
使用GroupJoin避免重复:
result = from l2 in list2
join l1 in list1 on l2.FK equals l1.Id into g
select l2;
答案 2 :(得分:0)
请注意AddressId
必须是公开的(但不建议您使用公共字段,以便将其更改为属性),这样您就可以执行此操作:
var yourList = addressList.Select(i => i.Id).Distinct();
taskList.Where(i => yourList.Contains(i.AddressId));
答案 3 :(得分:0)
List<Task> taskList = new List<Task>{new Task(2), new Task(3), new Task(5)};
List<Address> addrList = new List<Address>{new Address(1), new Address(3), new Address(2)};
var result = taskList.Where(x => addrList.Select(y => y.Id).Contains(x.AddressId));
答案 4 :(得分:0)
我经常喜欢使用的另一种选择:
我也可以使用HashSet<T>
代替List<T>
,然后您可以使用IntersectWith Method或 Intersect Method 来制作更流畅的代码: - )
所以你会有
var result = items1.Intersect(items2)