将Linq应用于实体加入我的代码

时间:2018-02-21 15:19:11

标签: c# linq-to-entities

我有适用的代码,但我在一个'加入'在Linq to Entities,因为我无法理解。 您能否告诉我如何将其成功应用到我的代码中?

我想要的结果是字典:

Dictionary<string, SelectedCorffData> dataSelectedForDeletion = new Dictionary<string, SelectedCorffData>();

上述课程:

public class SelectedCorffData
{
    public long CorffId { get; set; }
    public string ReportNumber { get; set; }
    public DateTime CorffSubmittedDateTime { get; set; }
}

请注意&#39; intersectResult&#39;我循环只是一个字符串集合。

这是我的代码:

DateTime dateToCompare = DateTime.Now.Date;
Dictionary<string, SelectedCorffData> dataSelectedForDeletion = new Dictionary<string, SelectedCorffData>();

foreach (var mafId in intersectResult)
{
    var corffIdsPerMaf = context
        .Mafs
        .Where(m => m.MafId == mafId)
        .Select(m => m.CorffId);

    var corffIdForMaf = context
        .Corffs
        .Where(c => corffIdsPerMaf.Contains(c.Id))
        .OrderByDescending(c => c.CorffSubmittedDateTime)
        .Select(c => c.Id)
        .First();

    //Selected close-out forms, whose MAF's may be up for deletion, based on date.
    var corffData = context
        .Corffs
        .Where(c => c.Id == corffIdForMaf && System.Data.Entity.DbFunctions.AddYears(c.CorffSubmittedDateTime, 1).Value > dateToCompare)                            
        .Select(c => new SelectedCorffData () { CorffId = c.Id,  ReportNumber = c.ReportNumber, CorffSubmittedDateTime = c.CorffSubmittedDateTime })
        .FirstOrDefault();

    if(corffData != null)
    {
        dataSelectedForDeletion.Add(mafId, corffData);
    }
}

请注意:这不仅仅是一个简单的加入。如果不能简化,请告诉我。还请解释原因。

1 个答案:

答案 0 :(得分:0)

下面的代码我认为不完全正确,但它接近你所需要的。我模拟了数据库,所以我可以得到正确的语法。

namespace System
{
    namespace Data
    {
        namespace Entity
        {
            public class DbFunctions
            {
                public static Data AddYears(DateTime submittedTime, int i)
                {

                    return new Data();
                }
                public class Data
                {
                    public int Value { get; set; }
                }

            }
        }
    }
}

namespace ConsoleApplication23
{
    class Program
    {
        static void Main(string[] args)
        {

            Context context = new Context();
            int dateToCompare = DateTime.Now.Year;

            var corffIdsPerMaf = context.Mafs.Select(m => new { id = m.CorffId, mafs = m}).ToList();
            var corffIdForMaf = context.Corffs
                  .Where(c => System.Data.Entity.DbFunctions.AddYears(c.CorffSubmittedDateTime, 1).Value > dateToCompare)
                  .OrderByDescending(c => c.CorffSubmittedDateTime).Select(c => new { id = c.Id, corff = c}).ToList();

            var intersectResult = from p in corffIdsPerMaf
                          join f in corffIdForMaf on p.id equals f.id
                          select new SelectedCorffData() { CorffId = p.id, ReportNumber = f.corff.ReportNumber, CorffSubmittedDateTime = f.corff.CorffSubmittedDateTime };


            Dictionary<string, SelectedCorffData> dataSelectedForDeletion = intersectResult.GroupBy(x => x.ReportNumber, y => y).ToDictionary(x => x.Key, y => y.FirstOrDefault());

        }
    }
    public class Context
    {
        public List<cMafs> Mafs { get; set;}
        public List<cCorffs> Corffs { get; set;}
    }
    public class cMafs
    {
        public int CorffId { get; set; }
    }
    public class cCorffs
    {
        public DateTime CorffSubmittedDateTime { get; set; }
        public int Id { get; set; }
        public string ReportNumber { get; set; }
    }
    public class Test
    {
    }

    public class SelectedCorffData
    {
        public long CorffId { get; set; }
        public string ReportNumber { get; set; }
        public DateTime CorffSubmittedDateTime { get; set; }
    }

}