LINQ过滤使用IEnumerable <t>选择输出

时间:2017-07-31 09:51:43

标签: c# linq

我有以下方法:

控制器:

...
var appmap = Services.GetReqAppMapList(value);
var applist = Services.GetApplicationList(docid, appid, reqid, appmap);
...

型号:

public static IEnumerable<AppMap> GetReqAppMapList(int aiRequestTypeId)
{
    try
    {
        var appmap = new List<AppMap>();
        using (var eties = new eRequestsEntities())
        {
            appmap = (from ram in eties.ReqAppMaps 
                      where ram.IsActive == 1
                      select new AppMap
                      {
                          RequestTypeId = ram.RequestTypeId
                      }).ToList();
            return appmap;
        }
    }
    catch(Exception e)
    {
        throw e;
    }           
}

public static IEnumerable<TicketApplication> GetApplicationList(int aiDocumentTypeId, int aiApplicationTypeId, int aiRequestTypeId, IEnumerable<AppMap> appmap)
{
    try
    {
        var applicationlist = new List<TicketApplication>();                    
        using (var applicationentity = new eRequestsEntities())
        {                 
            applicationlist = (from app in applicationentity.Applications
                               where 1==1   
                                <<<Some Conditions Here???>>>
== && appmap.Contains(app.ApplicationTypeId) ==
                                && app.IsActive == 1
                               select new TicketApplication
                               {
                                   ApplicationId = app.ApplicationId,
                                   Description = app.Description,
                                   DeliveryGroupId = app.DeliveryGroupId,
                                   ApplicationTypeId = app.ApplicationTypeId,
                                   DeliveryTypeId = app.DeliveryTypeId,
                                   DocumentTypeId = app.DocumentTypeId,
                                   SupportGroupId = app.SupportGroupId
                               }).OrderBy(a => a.Description).ToList();

            return applicationlist;
}

我在想如何使用GetReqAppMapList的结果过滤GetApplicationList的查询结果

我有点坚持我必须将某些内容转换/转换为正确类型的事实,因为每次我做一个结果。包含(appmap.Contains确切),我总是得到以下错误

  

错误4实例参数:无法转换   'System.Collections.Generic.IEnumerable<Test.Models.AppMap>'来   'System.Linq.ParallelQuery<int?>'

2 个答案:

答案 0 :(得分:0)

您应该在一个查询中直接加入这两个表。

using (var applicationentity = new eRequestsEntities())
{                 
    applicationlist = (from app in applicationentity.Applications
                       join ram in applicationentity.ReqAppMaps on app.ApplicationTypeId equals ram.RequestTypeId
                        where ram.IsActive == 1 && app.IsActive == 1
                       select new TicketApplication
                       {
                           ApplicationId = app.ApplicationId,
                           Description = app.Description,
                           DeliveryGroupId = app.DeliveryGroupId,
                           ApplicationTypeId = app.ApplicationTypeId,
                           DeliveryTypeId = app.DeliveryTypeId,
                           DocumentTypeId = app.DocumentTypeId,
                           SupportGroupId = app.SupportGroupId
                       }).OrderBy(a => a.Description).ToList();

如果不再需要,可以删除其他方法。没有必要挂在已死的代码上。

答案 1 :(得分:0)

看起来没有其他方法可以做到这一点(据我所知),所以我必须重构代码,我希望将来会有一个直接的转换和匹配方法(太懒) 。无论如何,请参阅下面的解决方案。希望这可以帮助将来遇到同样问题的人。我不确定性能,但现在应该可以使用。

控制器:

...
var appmap = Services.GetReqAppMapList(value);
var applist = Services.GetApplicationList(docid, appid, reqid, appmap);
...

型号:

<Removed GetReqAppMapList>--bad idea

public static IEnumerable<TicketApplication> GetApplicationList(int aiDocumentTypeId, int aiApplicationTypeId, int aiRequestTypeId)
{
    try
    {
       //This is the magic potion...
       List<int?> appmap = new List<int?>();
       var applist = (from ram in applicationentity.ReqAppMaps
                      where ram.RequestTypeId == aiRequestTypeId
                       && ram.IsActive == 1
                      select new AppMap
                      {
                         ApplicationTypeId = ram.ApplicationTypeId
                      }).ToList();

      foreach (var item in applist)
      {
         appmap.Add(item.ApplicationTypeId);
      }
      //magic potion end

      var applicationlist = new List<TicketApplication>();                    
      using (var applicationentity = new eRequestsEntities())
      {                 
         applicationlist = (from app in applicationentity.Applications
                            where 1==1
                        ===>>>&& appmap.Contains(app.ApplicationTypeId)<<<===
                             && app.IsActive == 1
                               select new TicketApplication
                               {
                                   ApplicationId = app.ApplicationId,
                                   Description = app.Description,
                                   DeliveryGroupId = app.DeliveryGroupId,
                                   ApplicationTypeId =app.ApplicationTypeId,
                                   DeliveryTypeId = app.DeliveryTypeId,
                                   DocumentTypeId = app.DocumentTypeId,
                                   SupportGroupId = app.SupportGroupId
                               }).OrderBy(a => a.Description).ToList();

            return applicationlist;
}

附注,C#是一种强类型语言,只需确保您的数据类型在评估期间匹配,因为 int? vs int 等。从不编译。一小部分LINQ就足以让一些新手在周围盘旋几个小时。我的ID-10T编程经验之一,但足以提醒我,我的脚仍然在地面上。