C# 当LINQ查询的条件为null时,如何防止出现多个结果?
假设以下两个SQL表 db.水果C# 当LINQ查询的条件为null时,如何防止出现多个结果?,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,假设以下两个SQL表 db.水果 ID Name F1 Apple F2 Orange F3 Melon ID Fruits_ID AttributeType AttributeValue A1 F1 Color Red A2 F3 Size Large A3 F2 Size Small A4 F1 Size S
ID Name
F1 Apple
F2 Orange
F3 Melon
ID Fruits_ID AttributeType AttributeValue
A1 F1 Color Red
A2 F3 Size Large
A3 F2 Size Small
A4 F1 Size Small
A6 F3 Color Brown
db.属性
ID Name
F1 Apple
F2 Orange
F3 Melon
ID Fruits_ID AttributeType AttributeValue
A1 F1 Color Red
A2 F3 Size Large
A3 F2 Size Small
A4 F1 Size Small
A6 F3 Color Brown
如何使用LINQ查询来搜索具有多个可为空条件的水果,而不因连接而使结果相乘?例如,如果条件
为null,则以下查询将生成多个结果
var q = from f in db.Fruits
join a in db.Attributes
on f.ID equals a.Fruits_ID
where string.IsNullOrEmpty(condition) || fa.AttributeValue.Contains(conditon)
select FruitResult
{
// ...
}
在任何情况下,我也调查了,
,但这对我不起作用
var q = from f in db.Fruits
join a in db.Attributes
on f.ID equals a.Fruits_ID
into FruitsAttributes
from fa in FruitsAttributes
where string.IsNullOrEmpty(condition) || fa.AttributeValue.Contains(conditon)
select FruitResult
{
// ...
}
当条件
为null或空时,上面仍然返回多个/合并的结果
TL;DR:如何使用一对多
。包含检查我的查询,以便在条件为空时返回单个“未连接”行?您可以尝试此查询:
var q = from f in db.Fruits
join a in db.Attributes
on f.Id equals a.FruitId
into g
select new FruitResult
{
Id = f.Id,
Name = f.Name,
Attribute = condition != null ? g.FirstOrDefault(a => a.AttributeValue.Contains(condition)) : null
};
您可以很容易地扩展select中的Retrieving属性值,我不知道您需要什么,所以我将其保留原样。我猜如果条件
为null,您会期望一个空集,因为它不匹配任何属性?最简单的方法就是单独处理这个案件
IEnumerable<FruitResult> q;
if (!string.IsNullOrEmpty(condition))
{
q = from f in db.Fruits
join a in db.Attributes
on f.ID equals a.Fruits_ID
where fa.AttributeValue.Contains(conditon)
select FruitResult
{
// ...
}
}
else
{
q = Enumberable.Empty<FruitResult>();
}
IEnumerable q;
如果(!string.IsNullOrEmpty(条件))
{
q=从f开始,单位为db
在db.Attributes中加入一个
关于f.ID等于a.u
其中fa.AttributeValue.Contains(条件)
选择结果
{
// ...
}
}
其他的
{
q=可枚举的.Empty();
}
终于找到了答案。它实际上非常简单,只需创建一个过滤器并跳过连接
var qFilter = from a in db.Attributes
where a.AttributeValue.Contains(condition)
select a.Fruits_ID
var q = from f in db.Fruits
where string.IsNullOrEmpty(condition) || qFilter.Contains(f.ID)
select FruitResult
{
// ...
}
我不太确定什么是条件
。我认为您应该联合两个查询,一个用于条件!=null
和一个不带连接的查询,条件==null
。例如var q1=from f in db.Fruits加入db.Attributes on f.ID等于a.Fruits\u ID,其中!string.IsNullOrEmpty(条件)| | fa.AttributeValue.Contains(条件)选择结果结果{/…};var q2=从db.Fruits中的f开始,其中string.IsNullOrEmpty(条件)选择水果结果{/…};var q=q1.联合(q2)事实上,情况正好相反。如果条件为空,则其行为应类似于一个“包罗万象”,即返回所有行。我在这里尝试的是避免由于连接而返回多行。