CRM 2011中具有四个实体和多个where子句的左外连接LINQ查询

CRM 2011中具有四个实体和多个where子句的左外连接LINQ查询,linq,linq-to-sql,linq-to-entities,dynamics-crm-2011,Linq,Linq To Sql,Linq To Entities,Dynamics Crm 2011,我在Microsoft Dynamics CRM 2011中遇到了一个问题 这里我有一套账户,其中有许可证,许可证ae与许可证国家有关,许可证国家与县有关 我希望得到这样的查询输出 但这是不恰当的 strSearch="Some text"; var lstItems = (from county in x.De_countySet join permitcounty in x.de_permitcountySet on county.De_countyId e

我在Microsoft Dynamics CRM 2011中遇到了一个问题 这里我有一套账户,其中有许可证,许可证ae与许可证国家有关,许可证国家与县有关

我希望得到这样的查询输出

但这是不恰当的

strSearch="Some text";

var lstItems = (from county in x.De_countySet
                join permitcounty in x.de_permitcountySet on county.De_countyId equals permitcounty.de_CountyId.Id
                join permit in x.de_permitSet on permitcounty.de_PermitId.Id equals permit.de_permitId
                join account in x.AccountSet on permit.de_AccountId.Id equals account.AccountId into outer

                where permit.de_Type.Equals("Type1") && permit.statuscode.Equals("Active")                // Permit Type as Type1 and Status as Active
                where account.De_LegalName.Contains(strSearch) || account.Name.Contains(strSearch)        // Search in Legal Name and Account full name
                where county.de_CountyName.Contains(strSearch)                                            // Search in County Name

                orderby county.de_CountyName
                from account in outer.DefaultIfEmpty()
                select new clsTemp
                {
                    Name = account.Name,
                    De_LegalName = account.De_LegalName,
                    Address1_Line1 = account.Address1_Line1,
                    Address1_City = account.Address1_City,
                    Address1_PostalCode = account.Address1_PostalCode,

                    de_CountyName = county.de_CountyName              
                 }).ToList();
感谢您的帮助


Vinu

这里有一种编写组连接的替代方法。请注意,包含
的行是唯一被替换的行:

strSearch="Some text";

var lstItems = (from county in x.De_countySet
                join permitcounty in x.de_permitcountySet on county.De_countyId equals permitcounty.de_CountyId.Id
                join permit in x.de_permitSet on permitcounty.de_PermitId.Id equals permit.de_permitId
                let outer = x.AccountSet.Where(account => permit.de_AccountId.Id == account.AccountId)

                where permit.de_Type.Equals("Type1") && permit.statuscode.Equals("Active")                // Permit Type as Type1 and Status as Active
                // "account" is not in scope and should cause a design-time error
                where account.De_LegalName.Contains(strSearch) || account.Name.Contains(strSearch)        // Search in Legal Name and Account full name
                where county.de_CountyName.Contains(strSearch)                                            // Search in County Name

                orderby county.de_CountyName
                from account in outer.DefaultIfEmpty()
                select new clsTemp
                {
                    Name = account.Name,
                    De_LegalName = account.De_LegalName,
                    Address1_Line1 = account.Address1_Line1,
                    Address1_City = account.Address1_City,
                    Address1_PostalCode = account.Address1_PostalCode,

                    de_CountyName = county.de_CountyName              
                 }).ToList();
以这种方式编写时,会发现一个明显的错误(
account
不在范围内)。也许还有其他问题。没有任何许可证的县将不会显示,而有多个许可证但没有任何帐户的县将有多行空白帐户。这是您想要的功能吗

编辑:第二次尝试:

strSearch="Some text";

var lstItems = (from county in x.De_countySet
                join permitcounty in x.de_permitcountySet on county.De_countyId equals permitcounty.de_CountyId.Id
                join permit in x.de_permitSet on permitcounty.de_PermitId.Id equals permit.de_permitId


                where permit.de_Type.Equals("Type1") && permit.statuscode.Equals("Active")                // Permit Type as Type1 and Status as Active

                where county.de_CountyName.Contains(strSearch)                                            // Search in County Name

                orderby county.de_CountyName
                from account in x.AccountSet.Where(account => 
                    permit.de_AccountId.Id == account.AccountId &&
                    (account.De_LegalName.Contains(strSearch) || 
                     account.Name.Contains(strSearch))).DefaultIfEmpty()   // Search in Legal Name and Account full name
                select new clsTemp
                {
                    Name = account.Name,
                    De_LegalName = account.De_LegalName,
                    Address1_Line1 = account.Address1_Line1,
                    Address1_City = account.Address1_City,
                    Address1_PostalCode = account.Address1_PostalCode,

                    de_CountyName = county.de_CountyName              
                 }).ToList();

你能帮我把它弄好吗?什么使它“不合适”?结果集是否不正确?是否存在异常?“GroupJoin”方法无法遵循方法“Join”或不受支持。请尝试使用支持的方法编写查询,或在调用不支持的方法之前调用“ASEUMENUMER”或“ToList”方法,“这是我试图用x.DecountySet等“ToList”更新查询的错误消息,但是没有用,
x.De_countySet
x.De_permitcountset
x.De_permitSet
x.AccountSet
的确切类型是什么?听起来至少有一家不支持LINQ。所有这些都是CRM 2011实体setsHi Risky Martin,非常感谢您的建议。当我尝试实现更改以及尝试访问网页时,我得到了如下错误:“System.NotSupportedException:方法'Where'不能跟随方法'Select'或不受支持。请尝试使用受支持的方法编写查询,或在调用不受支持的方法之前调用'AsEnumerable'或'ToList'方法。”. 我已通过“Name=account[“Name”]==null?null:account[“Name”]。ToString(),”修改了选择以处理空值结果是同样的错误我期望和你一样的结果explained@Vinu看起来我们必须不断尝试不同的方法,直到找到一种它喜欢的方法。@RiskyMartin-你似乎对这方面相当了解。你能看看我的问题,看看你是否能解释一下: