前言
已知存在两张表:表A和表B,表A中有一个字段存储的是表B的部分Id集合,以字符串的形式存储,如图1-1所示:
图1-1 表A中的字段
现在我获取到了表A中这个字段的值和表B中所有数据的实体集合,怎么用Lambda表达式找到表B中这些Id对应的实体的集合呢?这句话我写的可能有点绕,你可以多读几遍。
解决方案
List<AppointFunctionItem> APFI = functionItem.Select();
string relateItemId = programme.RelateItemDirectoryNO;
List<AppointFunctionItem> functionItemList =
APFI.Where(o =>relateItemId.Split(',').Contains(o.AppointFunctionItemID.ToString())).ToList();
如果这样看不懂的话,其实可以将其分解为如下代码:
List<AppointFunctionItem> APFI = functionItem.Select();
string relateItemId = programme.RelateItemDirectoryNO;
string[] ids = relateItemId.Split(',');
List<AppointFunctionItem> resultList = new List<AppointFunctionItem>();
for (int i = 0; i < ids.Length; i++)
{
resultList.Add(APFI.Find(o => o.AppointFunctionItemID.ToString() == ids[i]));
}
使用场景
其实这个操作,我之前的处理方式是将表A中的字符串作为查询条件去数据库直接读取符合条件的表B的实体集合,这样也可以实现。但是呢,程序中这个操作算的上是使用率较高的,如果采用这种方式,程序有时候会出现卡顿的现象(毕竟需要一次与服务器的交互)。而Lambda表达式正好解决了这个问题。
结语
第一种方式用where查询,一行代码即可,但是有点长。第二种方式用find查询,容易理解。两种方式的基本思路都是先用Split函数将字符串"1,2,3,4"
分解为字符串数组{"1","2","3","4"}
,再去根据此数组查询出满足条件的实体集合。第一种方式还用到了Contains函数。