gpt4 book ai didi

c# - 如何使用表达式构建动态查询(IN 子句)

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:44 24 4
gpt4 key购买 nike

我有

<!-- language: c# -->
Expression<Func<TEntity, bool>>

由属性组成

  • 开始日期日期时间
  • 结束日期时间
  • ShowArticles bool 值
  • ShowMaterials bool
  • ShowProducts bool

我想构建如下所示的动态查询:

SELECT * FROM Docs
WHERE StartDate >= @StartDAte
AND EndDate <= @EndDAte
AND ArticleInternalType IN (1,2,3)

所有 bool 类型都绑定(bind)到复选框 (Checked)。如果用户取消选中复选框查询,则也应更改。如果用户取消选中 ShowMaterials 复选框的示例:

SELECT * FROM Docs
WHERE StartDate >= @StartDate
AND EndDate <= @EndDAte
AND ArticleInternalType IN (1,3)

这个表达式给出了尴尬的结果

FilterExpression =
f => f.DocumentDate >= StartDate.Date && f.DocumentDate <= EndDate.Date
&& (
showArticles == true ? f.ArticleInternalType == 1 : f.ArticleInternalType == -1 ||
showMaterials == true ? f.ArticleInternalType == 0 : f.ArticleInternalType == -1 ||
showProducts == true ? f.ArticleInternalType == 2 : f.ArticleInternalType == -1
);

这是 SQLProfiler 的结果

WHERE 
([Extent1].[DocumentDate] >= @p__linq__0) AND ([Extent1].[DocumentDate] <= @p__linq__1)
AND
((CASE WHEN (1 = @p__linq__2) THEN
CASE WHEN (1 = [Extent1].[ArticleInternalType])
THEN cast(1 as bit)
WHEN (1 <> [Extent1].[ArticleInternalType])
THEN cast(0 as bit)
END
WHEN (1 = @p__linq__3) THEN
CASE WHEN (2 = [Extent1].[ArticleInternalType])
THEN cast(1 as bit)
WHEN (2 <> [Extent1].[ArticleInternalType])
THEN cast(0 as bit)
END
WHEN (1 = @p__linq__4) THEN
CASE WHEN (3 = [Extent1].[ArticleInternalType])
THEN cast(1 as bit)
WHEN (3 <> [Extent1].[ArticleInternalType])
THEN cast(0 as bit)
END
ELSE cast(0 as bit)
END) = 1)

谁能给我建议,怎么做?

最佳答案

你应该能够使用 int 类型的列表来做到这一点:

var types = new List<int>();
if (showArticles) types.Add(1);
if (showMaterials) types.Add(0);
if (showProducts) types.Add(2);
FilterExpression = f => f.DocumentDate >= StartDate.Date
&& f.DocumentDate <= EndDate.Date
&& types.Contains(f. ArticleInternalType);

您还可以简化您编写的表达式:

FilterExpression =
f => f.DocumentDate >= StartDate.Date && f.DocumentDate <= EndDate.Date
&& (
showArticles && f.ArticleInternalType == 1
|| showMaterials && f.ArticleInternalType == 0
|| showProducts && f.ArticleInternalType == 2
);

关于c# - 如何使用表达式构建动态查询(IN 子句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25106530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com