代码之家  ›  专栏  ›  技术社区  ›  ilivewithian

Linq中的追加或子查询

  •  3
  • ilivewithian  · 技术社区  · 14 年前

    我试图对一些实体(EF4,如果这有什么区别的话)建立一个简单的搜索。传递到我的搜索查询中的是条件对象列表。Criteria对象如下所示:

    public class ClaimSearchCirtieria
    {
        public Guid? FinancialYear { get; set; }
        public bool AllClaimants { get; set; }
        public IList<Guid> ClaimantIds { get; set; }
        public bool AllExpenseCategories { get; set; }
        public IList<ExpenseCategoryAndTypeCriteria> EpenseCategoryAndTypes { get; set; }
    }
    

    以及费用类别和类型标准

    public class ExpenseCategoryAndTypeCriteria
    {
        public Guid ExpenseCategory { get; set; }
        public bool AllTypesInCatgeory { get; set; }
        public IList<Guid> ExpenseTypes { get; set; }
    }
    

    搜索财政年度和索赔人需要是一个和查询,然后我需要费用类别和费用类型作为或子查询附加。

    实质上我想做的是:

    select * 
    from claims
    where <financial year> AND <Claimants> AND (expense type 1 OR expense type 2 or expense category X)
    

    到目前为止我得到了这个:

    public PagedSearchResult<Claim> Search(ClaimSearchCirtieria searchCriteria, int page, int pageSize)
    {
        var query = All();
    
        if (searchCriteria.FinancialYear.HasValue)
        {
            query = from claim in query
                    where claim.FinancialYearId == searchCriteria.FinancialYear
                    select claim;
        }
    
        if (!searchCriteria.AllClaimants)
        {
            query = from claim in query
                    where searchCriteria.ClaimantIds.Contains(claim.ClaimantId)
                    select claim;
        }
    
        if (!searchCriteria.AllExpenseCategories)
        {
            foreach (var item in searchCriteria.EpenseCategoryAndTypes)
            {
                if (item.AllTypesInCatgeory)
                {
                    //Just search on the category
                    query = query.Where(claim =>
                        (from transaction in claim.ClaimTransactions
                         where item.ExpenseCategory == transaction.ExpenseType.ExpenseCategoryId
                         select transaction).Count() > 0
                    );
                }
                else
                {
                    //Search for the specified types
                    query = query.Where(claim =>
                        (from transaction in claim.ClaimTransactions
                         where item.ExpenseTypes.Contains(transaction.ExpenseTypeId)
                         select transaction).Count() > 0
                    );
                }
            }
        }
    
        return PagedSearchResult<Claim>.Build(query, pageSize, page);
    }
    

    我现在看到的是最后一个请求的费用类别是我得到结果的唯一费用类别。另外,在代码中,我希望构建一系列和查询,而不是必需的或。

    有什么线索吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Craig Stuntz    14 年前

    你可以这样做 LINQKit's PredicateBuilder . 你需要使用 AsExpandable() 当编写实体框架查询时。