IQueryable Select中的Linq子查询

时间:2015-12-10 16:18:45

标签: c# entity-framework linq linq-to-entities subquery

我遇到linq-to-entities IQueryable查询中的子查询问题。

任何人都可以告诉我在构建IQueryable查询时执行子查询的正确方法是什么?基于我下面的完整示例。

在查询上调用ToArray()时出现以下错误:

An exception of type 'System.NotSupportedException' occurred in System.Data.Entity.dll but was not handled in user code

Additional information: LINQ to Entities does not recognize the method 'System.Data.Entity.IDbSet`1[MyDomain.NewsWorthyPressReleases.NewsWorthyWire] Set[NewsWorthyWire]()' method, 
and this method cannot be translated into a store expression.

例如,您可以在此处看到我的一个子查询:

BwIncluded = (from abw in Context.Set<NewsWorthyWire>()
                                          where abw.WireId == PressWireIds.BUID
                                          where abw.NewsWorthyCampaignId == nc.Id
                                          select abw).Any(),

如果存在任何(),我试图用真或假填充BwIncluded。

查询的整个构建如下,了解子查询的使用位置非常重要:

private Func<EntityFramework.IDbContext, IQueryable<NewsWorthyPressRelease>> GetSearchNewsWorthyQuery(NewsWorthySearchFields searchFields)
    {
        return context =>
        {
            //domain models
            var newsWorthyCampaigns = context.Set<NewsWorthyCampaign>();
            var wires = context.Set<NewsWorthyWire>();
            var campaigns = context.Set<Campaign>();


            //predicates
            var newsWorthyCampaignPredicate = PredicateBuilder.True<NewsWorthyCampaign>();
            var wirePredicate = PredicateBuilder.True<NewsWorthyWire>();
            var campaignPredicate = PredicateBuilder.True<Campaign>();


            // build up the predicate queries

            //Status was input
            if (searchFields.StatusId.HasValue && searchFields.StatusId.Value > 0)
            {
                newsWorthyCampaignPredicate = newsWorthyCampaignPredicate.And(x => x.Id == searchFields.StatusId);
            }

            //Id was input
            if (searchFields.Id.HasValue && searchFields.Id.Value > 0)
            {
                wirePredicate = wirePredicate.And(x => x.Id == searchFields.Id); 
            }

            //Title was input
            if (!string.IsNullOrEmpty(searchFields.Title))
            {
                wirePredicate = wirePredicate.And(x => x.Title.Contains(searchFields.Title));
            }

            //Wire was input
            if (searchFields.PressWireId.HasValue && searchFields.PressWireId.Value > 0)
            {
                wirePredicate = wirePredicate.And(x => x.Id == searchFields.PressWireId);
            }

            //Created By was chosen
            if (searchFields.CreatedById.HasValue && searchFields.CreatedById.Value > 0)
            {
                campaignPredicate = campaignPredicate.And(x => x.IdentityId == searchFields.CreatedById);
            }

            //Create Date From was chosen
            if (searchFields.DateCreatedFrom.HasValue)
            {
                campaignPredicate = campaignPredicate.And(y => y.CreationDate >= searchFields.DateCreatedFrom);
            }

            //Create Date To was chosen
            if (searchFields.DateCreatedTo.HasValue)
            {
                campaignPredicate = campaignPredicate.And(y => y.CreationDate <= searchFields.DateCreatedTo);
            }

            //the query
            var nwprQuery = (from nc in  newsWorthyCampaigns.Where(newsWorthyCampaignPredicate)
                             join w in wires.Where(wirePredicate)
                                on nc.Id equals w.NewsWorthyCampaignId
                            join c in campaigns.Where(campaignPredicate) 
                                on nc.CampaignId equals c.Id
                            select new NewsWorthyPressRelease
                            {
                                Id = nc.Id,
                                Title = w.Title,
                                //BwIncluded = false,
                                //GnIncluded = false,
                                //PrIncluded = false,
                                BwIncluded = (from abw in Context.Set<NewsWorthyWire>()
                                              where abw.WireId == PressWireIds.BUID
                                              where abw.NewsWorthyCampaignId == nc.Id
                                              select abw).Any(),
                                GnIncluded = (from agw in Context.Set<NewsWorthyWire>()
                                              where agw.WireId == PressWireIds.GLID
                                              where agw.NewsWorthyCampaignId == nc.Id
                                              select agw).Any(),
                                PrIncluded = (from anw in Context.Set<NewsWorthyWire>()
                                              where anw.WireId == PressWireIds.PRID
                                              where anw.NewsWorthyCampaignId == nc.Id
                                              select anw).Any(),
                                CreatedBy = c.CreatedBy.FirstName + " " + c.CreatedBy.Surname,
                                CreateDate = c.CreationDate,
                                Status = nc.NewsWorthyStatus.Name,
                            }).AsNoTracking();

            return nwprQuery;
        };
    }

任何人都可以帮忙吗?

由于

0 个答案:

没有答案