linq里lambda写的join查询,并附加动态拼接的条件,条件为enum类型的查询

因为查询条件不固定的原因,sql式的linq查询没法动态拼接条件。

网上搜的资料整理之后终于解决。

参考资料:

enum使用 http://blog.csdn.net/slowlifes/article/details/7799444

linq动态查询 http://msdn.microsoft.com/zh-cn/subscriptions/dd470085.aspx

lambda join使用 http://blog.csdn.net/lai_gb/article/details/4491843

 

复制代码
       string whereParams = GetWhereParams(SolutionGroup, CapabilityType);

            var query = crm.new_usercapabilitynew_usercapabilities.Where(uc => uc.new_user == SystemUserId).
                Join(
                    crm.new_capabilitynew_capabilities,
                    uc => uc.new_capabilityid,
                    c => c.new_capabilityid,
                    (uc, c) => new
                        {
                            uc,
                            c
                        }
                ).Where(o => o.c.new_name.Contains(Capability)).Where(whereParams)
                .OrderBy(o => o.uc.new_capabilityidLabel)
                .Select(o => new
                {
                    new_capabilityid = o.uc.new_capabilityid,
                    new_usercapabilityid = o.uc.new_usercapabilityid,
                    new_capabilityidLabel = o.uc.new_capabilityidLabel,
                    new_developmentarea = o.uc.new_developmentarea,
                    new_rating = o.uc.new_rating
                });
复制代码
复制代码
     public string GetWhereParams(string SolutionGroup, string CapabilityType) 
        {
            var enumgroup = Enum.GetNames(typeof(Xrm.new_capability.NewSolutiongroup)).Where(e => e.ToLower().Contains(SolutionGroup.ToLower())).ToList();
            string groupLinqStr = "";
            if (enumgroup.Count > 0)
            {
                groupLinqStr += "(";
                for (int i = 0; i < enumgroup.Count; i++)
                {
                    Xrm.new_capability.NewSolutiongroup enumitem = (Xrm.new_capability.NewSolutiongroup)Enum.Parse(typeof(Xrm.new_capability.NewSolutiongroup), enumgroup[i]);
                    groupLinqStr += "c.new_solutiongroup = " + ((int)enumitem).ToString();
                    if (i != enumgroup.Count - 1)
                    {
                        groupLinqStr += " or ";
                    }
                }
                groupLinqStr += ")";
            }
            else if (!string.IsNullOrEmpty(SolutionGroup))
            {
                groupLinqStr += "c.new_solutiongroup = 0";
            }

            var enumtype = Enum.GetNames(typeof(Xrm.new_capability.NewCapabilitytype)).Where(e => e.ToLower().Contains(CapabilityType.ToLower())).ToList();
            if (enumtype.Count > 0)
            {
                if (groupLinqStr.Length > 0) groupLinqStr += " and ";
                groupLinqStr += "(";
                for (int i = 0; i < enumtype.Count; i++)
                {
                    Xrm.new_capability.NewCapabilitytype enumitem = (Xrm.new_capability.NewCapabilitytype)Enum.Parse(typeof(Xrm.new_capability.NewCapabilitytype), enumtype[i]);
                    groupLinqStr += "c.new_capabilitytype = " + ((int)enumitem).ToString();
                    if (i != enumtype.Count - 1)
                    {
                        groupLinqStr += " or ";
                    }
                }
                groupLinqStr += ")";
            }
            else if (!string.IsNullOrEmpty(CapabilityType))
            {
                if (groupLinqStr.Length > 0) groupLinqStr += " and ";
                groupLinqStr += "c.new_capabilitytype = 0";
            }
            return groupLinqStr;
        }
复制代码

 

posted @   十二月雨  阅读(1114)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示