繁体   English   中英

具有动态where条件和条件的动态linq查询

[英]Dynamic linq query with dynamic where conditions and from conditions

public GetApplicants(string Office,
                         int Id,
                         List<int> cfrparts,
                         List<int> expertiseAreaIds,
                         List<int> authIds,
                         List<int> specIds)
    {
        bool isAuthIdsNull = authIds == null;
        authIds = authIds ?? new List<int>();
        bool isSpecIdNull = specIds == null;

enter code here
     var query =
            from application in Apps
            from cfr in application.cfr
            from exp in cfr.Aoe
           from auth in exp.Auth
            from spec in exp.Special

            where application.Design.Id == 14
            where  (iscfrpart || cfrPartIds.Contains(cfr.CfrP.Id))
            where (isexp || expertiseAreaIds.Contains(exp.Aoe.Id))
            where (isAuthIdsNull || authIds.Contains(auth.Auth.Id))
            where  (isSpecIdNull || specIds.Contains(spec.Special.Id))
            where application.Office.Text.Contains(Office)
            where application.D.Id == Id

            select application.Id;

我怎样才能使这个查询动态。 如果我只有Id和Office值,则仍应基于可用值给我结果集。 当然,它没有给我结果。

而不是多次调用where ,请使用&&

 var query =
        from Apps
        where (iscfrpart || cfrPartIds.Contains(Apps.cfr.CfrP.Id))
        && (isexp || expertiseAreaIds.Contains(Apps.cfr.Aoe.Id))
        && (isAuthIdsNull || authIds.Contains(Apps.cfr.Aoe.Auth.Id))
        && (isSpecIdNull || specIds.Contains(Apps.cfr.Aoe.Special.Id))
        && Apps.Office.Text.Contains(Office)
        && Apps.D.Id == Id

        select application.Id;

此外,与此子句结合使用,此子句application.D.Id == 14将导致0个结果:如果传入的ID不等于14,则application.D.Id == Id 。您可能希望删除该第一个子句。

编辑:更新了您的from子句,但我仍然认为这不起作用,因为您的表结构似乎已关闭。

解决此问题不需要动态查询。 您可以编写构造查询的代码。

制定一种根据所拥有的信息来构造过滤器的方法。

public Expression<Func<Application, bool>> GetFilterForCFR(List<int> cfrParts)
{
  if (cfrParts == null || !cfrParts.Any())
  {
    return app => true;
  }
  else
  {
    return app => app.cfr.Any(cfr => cfrParts.Contains(cfr.cfrPId));
  }
}

然后,您可以使用表达式构造查询。

var query = Apps;
var cfrFilter = GetFilterForCFR(cfrParts);
query = query.Where(cfrFilter);

//TODO apply the other filters

var finalquery = query.Select(app => app.Id);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM