C# 当LINQ查询的条件为null时,如何防止出现多个结果?

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

假设以下两个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            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)