使用IEnumerable<T>进行LINQ过滤选择输出

3

I have following methods:

Controller:

...
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的查询结果。

我遇到了一个问题,必须将某些内容转换/强制转换为正确的类型,因为每次执行result.Contains(实际上是appmap.Contains)时,都会出现以下错误:

Error 4 Instance argument: cannot convert from 'System.Collections.Generic.IEnumerable<Test.Models.AppMap>' to 'System.Linq.ParallelQuery<int?>'


你在哪里/如何使用GetReqAppMapList?你需要提供更多的代码... - dipak
你能展示一个调用appmap.Contains的例子吗? - stuartd
由于您提到ParallelQuery的唯一位置是在错误消息中,因此很难知道您做错了什么。 - Lasse V. Karlsen
2个回答

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();

如果不再需要其他方法,您可以将其删除。保留无用代码是没有意义的。


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 就足以让一些新手绕圈子数小时。这是我犯的一个低级错误,但足以提醒我要脚踏实地。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接