Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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# 使用不正确参数的Linq到实体_C#_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

C# 使用不正确参数的Linq到实体

C# 使用不正确参数的Linq到实体,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,我已经为此工作了将近9个小时,只是不明白到底发生了什么。我创建了一个高级查询生成器,允许用户将部件添加到where子句中。我的计划是利用推迟执行的机会。问题是我知道有记录的东西的计数一直是0。更令人费解的是,只有当我有一个以上的查询时才会发生这种情况。因为我不能给出我的数据模型和所有代码,所以我总结了这一点,下面是一个基本代码示例: string foo = "smith"; var result = context.claims.AsQueryable();

我已经为此工作了将近9个小时,只是不明白到底发生了什么。我创建了一个高级查询生成器,允许用户将部件添加到where子句中。我的计划是利用推迟执行的机会。问题是我知道有记录的东西的计数一直是0。更令人费解的是,只有当我有一个以上的查询时才会发生这种情况。因为我不能给出我的数据模型和所有代码,所以我总结了这一点,下面是一个基本代码示例:

        string foo = "smith";
        var result = context.claims.AsQueryable();
        var temp = from p in result
                   where p.Prescription.Patient.last_name.Contains(foo)
                   select p;
        foo = "jo";
        temp = from p in temp
               where p.Prescription.Patient.first_name.Contains(foo)
               select p;
        int count = temp.Count();
现在,我的期望是,这将给我一个查询,返回患者姓氏像“%smith%”和名像“%jo%”的结果。但是,以下是执行的查询:

    exec sp_executesql N'SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM     [dbo].[claim] AS [Extent1]
    INNER JOIN [dbo].[Prescription] AS [Extent2] ON [Extent1].[prescriptionId] = [Extent2].[id]
    LEFT OUTER JOIN [dbo].[Patient] AS [Extent3] ON [Extent2].[patient_id] = [Extent3].[id]
    LEFT OUTER JOIN [dbo].[Prescription] AS [Extent4] ON [Extent1].[prescriptionId] = [Extent4].[id]
    LEFT OUTER JOIN [dbo].[Patient] AS [Extent5] ON [Extent4].[patient_id] = [Extent5].[id]
    WHERE ([Extent3].[last_name] LIKE @p__linq__0 ESCAPE N''~'') AND ([Extent5].[first_name] LIKE @p__linq__1 ESCAPE N''~'')
)  AS [GroupBy1]',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',**@p__linq__0=N'%jo%',@p__linq__1=N'%jo%**'
从执行的查询中可以看出,我没有得到预期的结果。相反,它将linq查询上的两个参数都设置为变量的最后一个值

有人能解释一下为什么会这样吗?我找到了一个解决办法,但它并不漂亮。我必须为每个可能的列声明一个变量,并将该变量=设置为值,然后在linq语句中使用该变量:

        string foo = "smith", foo2 = "jo";
        var result = context.claims.AsQueryable();
        var temp = from p in result
                   where p.Prescription.Patient.last_name.Contains(foo)
                   select p;
        temp = from p in temp
               where p.Prescription.Patient.first_name.Contains(foo2)
               select p;
        int count = temp.Count();


还可以看看如何使用动态组合表达式谓词。如果您需要动态地构建一个混合了&&和| |的复杂查询,它可能会很有用。

因为执行是延迟的,所以在您实际枚举结果计数之前,查询表达式不会被转换。此时,foo的价值是jo。感谢Wiktor的快速响应!!这是有道理的,但它确实会引起我的逻辑问题!!我真不敢相信我找不到其他人看到过这个。十分钟后你找到了@WiktorZychla,他看到了它。有两个不同的字符串作为两个不同的字符串有什么不好?有两个字符串的问题是,在现实世界中,我希望有N个列来搜索,我试图创建一个函数来动态添加子句。然而,如果我必须知道有多少个子句,那么它会使它变得不那么动态,并且更加硬编码。按照你处理一个又一个代码块的方法,你必须知道这一点,所以你要写出那么多的代码块。对于实际代码,您可能需要某种可枚举、列表、数组等,或者对一个刚刚添加了一个的函数进行多次调用,这样您就不会有问题。
int count = result.Count(x=> x.Prescription.Patient.last_name.Contains(foo) && 
                             x.Prescription.Patient.first_name.Contains(foo2));
var result = (from p in result
              where (p.Prescription.Patient.last_name.Contains(foo) && 
                     p.Prescription.Patient.first_name.Contains(foo2))
              select p).Count();