根据同一订单中另一个列表中的项目从一个列表中选择项目

时间:2017-11-07 21:25:09

标签: c# linq select

exhibits包含按特定顺序排列的ID。当我查询另一个表以获取基于BMI ID的exhibit ID时,顺序不一样。我没有在exhibit中提取第一个文档ID,而是在数据库中提取具有相同exhibit id的第一条记录,但我希望它能够将数据库中的记录拉到同一个以exhibits ID排序。

var exhibits = _context.ApExhibits.Where(x => x.CASE_ID == apDockets.CASE_ID)
    .Where(x => x.EXHIBIT_NBR != null)
    .Where(x => !documents617.Contains(x.DOC_ID))
    .OrderBy(x => x.EXHIBIT_NBR)
    .Select(x => x.DIM_ID).ToList();

if (exhibits.Count > 0)
{
    var bmiIds =
        _context.DocumentImages.Where(x => exhibits.Contains((int)x.DIM_ID))
            .Select(x => (int)x.BMI_ID).ToList();
}

1 个答案:

答案 0 :(得分:0)

似乎您的第一个集合exhibits是基于EXHIBIT_NBR排序的,而当您查询_context.DocumentImages时,您并未按相同属性对其进行排序,因此您将会根据源序列中元素的顺序接收结果,在本例中为_context.DocumentImages。基本上,你说“给定源序列DocumentImages的一个元素,在exhibits集合中线性搜索,如果有一个符合给定条件的元素,则保留元素源序列“

因此,假设要传递到DocumentImages子句的源序列Where中的第一个元素与集合id中的元素具有等效exhibits,但是exhibits中的元素位于5th位置,当我们执行ToList() eager 对方法的操作,而技术上应该在结果列表的5th位置,因为来自exhibits的匹配元素也位于5th位置。

因此,为了使元素与exhibits具有相同的顺序,一个解决方案是内部联接 DocumentImagesexhibits集合相当于检查一个集合中的一个元素是否包含在另一个集合中。然后,我们可以使用与exhibits相同的属性进行排序。

查询语法示例:

var bmiIds = (from e in _context.ApExhibits
              join x in _context.DocumentImages on e.DIM_ID equals (int)x.DIM_ID
              where exhibits.Contains((int)x.DIM_ID)
              orderby e.EXHIBIT_NBR
              select (int)x.BMI_ID).ToList();

使用流利语法的示例:

var bmiIds = _context.ApExhibits
                     .Join(_context.DocumentImages,
                          e => e.DIM_ID,
                          x => (int)x.DIM_ID,
                         (e, x) => new { e.EXHIBIT_NBR, x.BMI_ID })
                     .Where(x => exhibits.Contains((int)x.DIM_ID))
                     .OrderBy(e => e.EXHIBIT_NBR)
                     .Select(x => (int)x.BMI_ID).ToList();