Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 林克:“我不知道。”;枚举未产生任何结果”;_C#_Linq - Fatal编程技术网

C# 林克:“我不知道。”;枚举未产生任何结果”;

C# 林克:“我不知道。”;枚举未产生任何结果”;,c#,linq,C#,Linq,我在试图让LINQ语句正常工作时经历了一段糟糕的时光 在这篇文章之后,我尝试使用SQL语法和lambda: 这就是我的工作SQL的样子: SELECT ws_lookup_OccupationGroup.Code FROM ws_lookup_OccupationGroup INNER JOIN ws_lookup_Occupation ON ws_lookup_OccupationGroup.Code = ws_lookup_Occupation.ws_lookup_OccupationGr

我在试图让LINQ语句正常工作时经历了一段糟糕的时光

在这篇文章之后,我尝试使用SQL语法和lambda:

这就是我的工作SQL的样子:

SELECT ws_lookup_OccupationGroup.Code
FROM ws_lookup_OccupationGroup
INNER JOIN ws_lookup_Occupation ON
ws_lookup_OccupationGroup.Code = ws_lookup_Occupation.ws_lookup_OccupationGroup_Code
WHERE (ws_lookup_Occupation.Code = N'413')
这是我第一次尝试,但没有结果:

var query = from occupationGroup in db.ws_lookup_OccupationGroups 
            join occupations in db.ws_lookup_Occupations on occupationGroup.Code equals occupations.Code 
            where occupations.Code == model.Client.Client_Details_Enhanced.Occupation.Code 
            select new 
            { 
                OccupationGroup = occupationGroup, 
                Occupations = occupations 
            };
var queryLambda = db.ws_lookup_OccupationGroups
                    .Join(db.ws_lookup_Occupations, 
                          occupation => occupation.Code, 
                          occupationGroup => occupationGroup.Code,
                          (occupation, occupationGroup) => new 
                          { 
                              OCCUPATION = occupation, 
                              OCCUPATIONGROUP = occupationGroup 
                          })
                    .Where(all => all.OCCUPATION.Code == model.Client.Client_Details_Enhanced.Occupation.Code);
这是我第二次尝试使用Lamdba,也没有结果:

var query = from occupationGroup in db.ws_lookup_OccupationGroups 
            join occupations in db.ws_lookup_Occupations on occupationGroup.Code equals occupations.Code 
            where occupations.Code == model.Client.Client_Details_Enhanced.Occupation.Code 
            select new 
            { 
                OccupationGroup = occupationGroup, 
                Occupations = occupations 
            };
var queryLambda = db.ws_lookup_OccupationGroups
                    .Join(db.ws_lookup_Occupations, 
                          occupation => occupation.Code, 
                          occupationGroup => occupationGroup.Code,
                          (occupation, occupationGroup) => new 
                          { 
                              OCCUPATION = occupation, 
                              OCCUPATIONGROUP = occupationGroup 
                          })
                    .Where(all => all.OCCUPATION.Code == model.Client.Client_Details_Enhanced.Occupation.Code);
我只是看不出哪里出了问题

我不知道这是否有任何相关性,但我使用的是代码优先实体框架-他是我的职业组和职业模型:

public class ws_lookup_OccupationGroup {
    [Key]
    [MaxLength(250)]
    public string Code { get; set; }
    [MaxLength(250)]
    public string Name { get; set; }
    public int SortOrder { get; set; }
    public List<ws_lookup_Occupation> Occupations { get; set; }
}
public class ws_lookup_Occupation {
    [Key]
    [MaxLength(10)]
    public string Code { get; set; }
    [MaxLength(250)]
    public string Name { get; set; }
    [MaxLength(250)]
    public string BarbadosMotorFactor { get; set; }
    [MaxLength(250)]
    public string TrinidadMotorFactor { get; set; }
    [MaxLength(250)]
    public string OtherRegionsMotorFactor { get; set; }
}
公共类ws\u lookup\u职业组{
[关键]
[最大长度(250)]
公共字符串代码{get;set;}
[最大长度(250)]
公共字符串名称{get;set;}
公共int排序器{get;set;}
公共列表职业{get;set;}
}
公共类ws_查找\职业{
[关键]
[MaxLength(10)]
公共字符串代码{get;set;}
[最大长度(250)]
公共字符串名称{get;set;}
[最大长度(250)]
公共字符串参数{get;set;}
[最大长度(250)]
公共字符串参数{get;set;}
[最大长度(250)]
公共字符串OtherRegionsMotorFactor{get;set;}
}

在您的SQL中,您将通过以下方式加入

ws_lookup_OccupationGroup.Code = ws_lookup_Occupation.ws_lookup_OccupationGroup_Code
但在林克你加入了

occupationGroup.Code equals occupations.Code
取决于你的实体看起来是什么样的,我假设你真的需要这个

occupationGroup.Code = occupations.ws_lookup_OccupationGroup_Code
根据您的实体,您似乎可以使用导航属性而不是联接执行以下操作

var query = from occupationGroup in db.ws_lookup_OccupationGroups 
            where occupationGroup.Occupations.Any(
                o => o.Code == model.Client.Client_Details_Enhanced.Occupation.Code) 
            select occupationGroup;
获取至少有一个具有所需代码的职业的所有职业组。或者,如果你只是想把群体和职业结合起来,那么你可以这样做

var query = from occupationGroup in db.ws_lookup_OccupationGroups 
            from occupation in occupationGroup.Occupations
            where occupation.Code == model.Client.Client_Details_Enhanced.Occupation.Code
            select new 
            {
                occupationGroup,
                occupation
            };

与其直接回答你的问题,我倒不如提出一个策略建议。一种策略是添加一个扩展方法,该方法将显示实体框架查询或IQueryable将运行的SQL。这可以通过创建单元测试并执行测试驱动开发方法或TDD的方式来完成

您知道要获得预期结果的SQL。最好使用EF查询,直到得到一个SQL,该SQL将提供所需的结果。您可以调试一个集成测试,然后以自己的方式实现最终结果—您所追求的SQL—在实体框架Linq to Entities代码中编写

首先,我们可以创建以下扩展方法:

public static class IQueryableExtensions
    {

        /// <summary>
        /// Shows the sql the IQueryable query will be generated into and executed on the DbServer
        /// </summary>
        /// <param name="query">The IQueryable to analyze</param>
        /// <param name="decodeParameters">Set to true if this method should try decoding the parameters</param>
        /// <remarks>This is the generated SQL query in use for Entity Framework</remarks>
        public static string ShowSql(this IQueryable query, bool decodeParameters = false)
        {
            var objectQuery = (ObjectQuery)query; 

            string result = ((ObjectQuery)query).ToTraceString();

            if (!decodeParameters)
                return result; 

            foreach (var p in objectQuery.Parameters)
            {
                string valueString = p.Value != null ? p.Value.ToString() : string.Empty;
                if (p.ParameterType == typeof(string) || p.ParameterType == typeof(DateTime))
                    valueString = "'" + valueString + "'";
                result = result.Replace("@" +p.Name, p.Value != null ? valueString : string.Empty); 
            }
            return result; 
        }     

}
当然,您可以使用Linqpad来查找所需的EF查询和SQL,但此策略的好处是,您可以在visualstudio中使用它来处理更复杂的真实场景,与在VS和Linqpad之间切换相比,您还可以获得更好的调试体验


如果调试这样的集成测试,那么就可以观察生成的SQL。请注意,如果要运行集成测试而不调试它,您也可以执行Console.WriteLine或Debug.WriteLine来查看输出。

您是否尝试过硬编码值为413的语句,而不是
model.Client.Client\u Details\u Enhanced.occulation.code
?只是尝试了一下-也没有产生任何结果:(您的查询的两个版本看起来都是正确的。您是否分析了数据库以查看实际发出的SQL?对于调试此类查询非常有用,您可以像在Management Studio中一样快速编辑查询。在SQL中,您加入的是
ws\u lookup\u occulation.ws\u lookup\u occulationgroup\u code
,但在Linq中,您加入的是
职业。code
。但是你真的应该使用而不是加入。我不知道正确的加入语法应该是什么-我对linq很陌生-你能帮我一下语法吗?@trevordanian请看我的更新。你只需要使用对应于相同列的属性(它们通常具有相同的名称).occupations.ws_lookup_OccupationGroup_代码不可见-只有一个列表-我已经用我的模型更新了我的问题…我仍然很困惑。@TrevorDaniel我已经用使用导航属性的查询更新了我的答案。你必须准确地确定你想要什么来确定你应该如何使用它们。你是我的英雄!-我欠你几天啤酒:)