我现在已经工作了近9个小时,只是不明白发生了什么。我创建了一个高级查询生成器,允许用户将部件添加到其where子句中。我的计划是利用延期执行。问题是,我一直记得0,因为我知道记录的东西。让这更令人费解的是,只有当我有超过1个查询时才会发生这种情况。因为我不能给你我的数据模型和我的所有代码,所以我总结了这一点,这是一个基本的代码示例:
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();
答案 0 :(得分:0)
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();
另请参阅使用PredicateBuidler动态组合表达式谓词。如果您需要动态构建复杂查询,混合使用&&和||。