【问题标题】:Append OR subquery in Linq在 Linq 中追加 OR 子查询
【发布时间】:2010-09-27 10:19:17
【问题描述】:

我正在尝试针对某些实体(EF4,如果这有什么不同的话)构建一个简单的搜索。传入我的搜索查询的是标准对象列表。 crieteria 对象如下所示:

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; }
}

还有 ExpenseCategoryAndTypeCriteria

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

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

本质上我正在尝试做:

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

我目前看到的是,最后一个请求的费用类别是我获得结果的唯一费用类别。此外,查看代码,我似乎希望这是构建一系列 AND 查询,而不是所需的 OR。

任何指针?

【问题讨论】:

    标签: linq entity-framework c#-4.0


    【解决方案1】:

    您可以使用LINQKit's PredicateBuilder 执行此操作。编写实体框架查询时需要使用AsExpandable()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      相关资源
      最近更新 更多