2

设想:

我有一个通用的审计列表和一个通用的 AuditImage 列表。这两个列表是从数据库表中编译的。因此,一个 AuditImage 可以进行许多审核。正如您将在下面看到的,表映射到的类在数据库中时通过外键关系“ImageID”连接,但是一旦将数据提取到代码中的列表,就没有“物理连接”。

数据库表映射到的类:

public class AuditImage
{
    public Guid ImageID { get; set; }
    public string LowResUrl { get; set; }
}

public class Audit
{
    public Guid AuditID { get; set; }
    public Guid ImageID { get; set; }
    public DateTime CreatedDate { get; set; }
    public string CreatedBy { get; set; }
    public string Comment { get; set; }
}

问题:

我现在想通过从每个列表中提取数据并将其在“Audit.ImageID == AuditImage.ImageID”上组合到一个新列表中来编译一个“Trail”对象列表。

public class Trail
{
    public Guid ImageID { get; set; }
    public DateTime CreatedDate { get; set; }
    public string CreatedBy { get; set; }
    public string Comment { get; set; }
    public string LowResUrl { get; set; }
}

(上面基本上结合了“LowResUrl”字段与基于 ImageID 相同的每个审核。)

问题:

我该怎么做呢!?我曾考虑过使用 foreach 循环和 linq 来创建一个新的跟踪对象列表,但我不太清楚我将如何去做?!

帮助将不胜感激。

4

7 回答 7

4

你可以做


var trails = from audit in audits
   join image in auditImages on audit.ImageId equals image.ImageId
   select new Trail { ImageID = audit.ImageId, CreatedDate = audit.CreatedDate,
                      CreatedBy = audit.CreatedBy, Comment = audit.Comment,
                      LowResUrl = image.LowResUrl };
于 2009-09-30T09:38:59.113 回答
0

尝试 List 上的 Intersect 扩展方法:http: //msdn.microsoft.com/en-us/library/bb910215.aspx

我还认为你应该审查你的设计并引入一个通用接口 IAudi 或类似的东西。

于 2009-09-30T09:30:23.180 回答
0

这可以工作.......

public List<JobImageAudit> CombineForAuditTrail()
        {
            var result = from a in auditList
                         join ai in imageList
                         on a.ImageID equals ai.ImageID
                         //into ait // note grouping        
                         select new JobImageAudit
                         {
                             JobID = a.JobID,
                             ImageID = a.ImageID.Value,
                             CreatedBy = a.CreatedBy,
                             CreatedDate = a.CreatedDate,
                             Comment = a.Comment,
                             LowResUrl = ai.LowResUrl,

                         };
            return result.ToList();
        }
于 2009-09-30T09:42:48.810 回答
0

我可能会使用扩展方法,只是因为我不太容易进入 linq:

IEnumerable<Trail> trailList = auditImageList.Join(
  auditList, 
  auditImageItem => auditImageItem.ImageId, 
  auditItem => auditItem.ImageId,
  (auditImageItem, auditItem) =>  new Trail() 
  {  
    LowResUrl = auditImageItem.LowResUrl,
    ImageID = auditImageItem.ImageId, 
    CreatedDate = auditItem.CreatedDate,
    CreatedBy = auditItem.CreatedBy, 
    Comment = auditItem.Comment,
  });
于 2009-09-30T09:45:25.267 回答
0

这将解决问题.. from var query 只需添加到循环中的跟踪对象

    var query = from auditImage in AuditImageList 
    join audit in AuditList 
on auditImage.ImageID equals audit.ImageID 
select new { ImageID= auditImage.ImageID, CreatedDate = audit.CreatedDate, CreatedBy = audit.CreatedBY, Comment = audit.Comment , LowResUrl = auditImage.LowResUrl }; 

foreach (var trail in query) { //Assign Values to trail object and add to list of trails }
于 2009-09-30T09:46:30.643 回答
0

取决于你想要什么:

内连接(仅AuditImage在有 时显示Audit):

var innerJoin = from image in images
                join audit in audits on image.ImageID equals audit.ImageID
                select new { image.ImageID, AuditImageId = audit.ImageID };

左连接(AuditImage即使没有 也显示Audit):

var leftJoin = from image in images
               join audit in audits on image.ImageID equals audit.ImageID
               into auditCats
               from auditCat in auditCats.DefaultIfEmpty(new Audit())
               select new { image.ImageID, AuditImageId = auditCat.ImageID };
于 2009-09-30T09:46:47.870 回答
0

至少有两种选择。

首先是做简单的加入:

var trails = Audits.Join(Images, a => a.ImageID, i => i.ImageID, (a, i) =>
    new Trail
    {
        Comment = a.Comment,
        CreatedBy = a.CreatedBy,
        CreatedDate = a.CreatedDate,
        ImageID = a.ImageID,
        LowResUrl = i.LowResUrl
    });

二是使用子查询:

var trails = Audits.Select(a =>
    new Trail
    {
        Comment = a.Comment,
        CreatedBy = a.CreatedBy,
        CreatedDate = a.CreatedDate,
        ImageID = a.ImageID,
        LowResUrl = Images.Single(i => i.ImageID == a.ImageID).LowResUrl
    });

如果 ImageID 是唯一的,两者都应该可以正常工作,但我个人更喜欢子查询,因为它看起来比连接更自然。

于 2009-09-30T09:50:26.303 回答