如何使以下linq泛型方法返回不同的记录?
当使用下面的方法进行OR操作时,我将返回重复的记录。是否必须指定自定义IEqualityComparer?简单的distinct()不起作用如何使以下linq泛型方法返回不同的记录?,linq,generics,distinct,Linq,Generics,Distinct,当使用下面的方法进行OR操作时,我将返回重复的记录。是否必须指定自定义IEqualityComparer?简单的distinct()不起作用 internal static IQueryable<T> FilterEntity<T>(filters filters, IQueryable<T> entities) { if (filters.groupOp == "AND") foreach (var rule
internal static IQueryable<T> FilterEntity<T>(filters filters, IQueryable<T> entities)
{
if (filters.groupOp == "AND")
foreach (var rule in filters.rules)
entities = entities.Where<T>(
rule.field, rule.data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation), rule.op)
);
else
{
//Or
IQueryable<T> temp = (new List<T>()).AsQueryable();
foreach (var rule in filters.rules)
{
var t = entities.Where<T>(
rule.field, rule.data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation), rule.op)
);
temp = temp.Concat<T>(t).AsQueryable();
}
entities = temp;
}
return entities;
}
内部静态IQueryable筛选器属性(筛选器、IQueryable实体)
{
如果(filters.groupOp==“AND”)
foreach(filters.rules中的var规则)
实体=实体。其中(
rule.field,rule.data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation),rule.op)
);
其他的
{
//或
IQueryable temp=(新列表()).AsQueryable();
foreach(filters.rules中的var规则)
{
var t=实体。其中(
rule.field,rule.data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation),rule.op)
);
温度=温度Concat(t).AsQueryable();
}
实体=临时;
}
返回实体;
}
根据下面@usr的建议进行编辑-这在sql profiler中为我提供了正确的查询(带有一个独特的名称),但这看起来太复杂了-我想这是一个更干净的解决方案
internal static IQueryable<T> FilterEntity<T>(filters filters, IQueryable<T> entities)
{
if (filters.groupOp == "AND")
foreach (var rule in filters.rules)
entities = entities.Where<T>(
rule.field, rule.data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation), rule.op)
);
else
{
//Or
var t1 = entities.Where<T>(filters.rules[0].field,filters.rules[0].data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation),filters.rules[0].op)
);
for (int i = 1; i<filters.rules.Count(); i++)
{
var t = t1.Where<T>(filters.rules[i].field, filters.rules[i].data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation), filters.rules[i].op)
);
t1.Concat<T>(t).AsQueryable();
}
entities = t1;
}
return entities.Distinct<T>();
}
内部静态IQueryable筛选器属性(筛选器、IQueryable实体)
{
如果(filters.groupOp==“AND”)
foreach(filters.rules中的var规则)
实体=实体。其中(
rule.field,rule.data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation),rule.op)
);
其他的
{
//或
var t1=实体。其中(filters.rules[0]。字段,filters.rules[0]。数据,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation),filters.rules[0].op)
);
对于(int i=1;i这与Distinct()
或IEqualityComparer
无关。这是,即:循环变量规则
必须复制到循环体中:
foreach (var rule in filters.rules)
{
var rule1 = rule;
// work with rule1 only.
您可以按照Usr的建议执行以下操作:
IQueryable<T> temp = null;
....
foreach (var rule in filters.rules)
{
var rule1 = rule;
var t = entities.Where<T>(rule1.field, rule1.data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation), rule1.op));
if (temp == null)
temp = t;
else
temp = temp.Union(t); // Union!!
}
}
return temp;
IQueryable temp=null;
....
foreach(filters.rules中的var规则)
{
var rule1=规则;
var t=实体。其中(rule1.field,rule1.data,
(WhereOperation)StringEnum.Parse(typeof(WhereOperation),rule1.op);
if(temp==null)
温度=t;
其他的
临时=临时接头(t);//接头!!
}
}
返回温度;
我想知道它是否解决了您的问题。请注意使用了联合
(这是一种隐式的不同的
)。如果它不能解决您的问题,我认为有一些我们看不见的代码(例如,在您的where操作
)会产生干扰。不要从列表开始您的查询。从第一个开始“t
”。这样,您将只得到一个在服务器上执行的查询。使用Union而不是Concat来获得不同的结果。在几乎所有LINQ提供程序中,您不能将“new List()”与LINQ查询一起使用。此代码不是您想要的(尽管它可以正常运行)。它太频繁地调用数据库。这不是一个真正的查询。它为我使用的每个规则创建一个查询;只是没有做一个独立的查询;它正在做我想做的事情-只是不是全部;你有更好的方法实现多个动态搜索吗?-当我为我拥有的每个实体编写一个单独的筛选器类时,我很高兴切换到它的相同问题e使用List而不是ListOK,您能提供一些详细信息吗?无差异,异常?对于满足OR操作中指定的1个以上条件的记录,返回重复记录(我将此用于客户端网格)-没有例外。好吧,修改后的关闭问题仍然存在。实体
是实体的简单集合,还是它在进入过滤属性
之前已经应用了的位置
?联合也不起作用-你能告诉我如何开始而不在我实施的第一个解决方案上方添加列表吗对于第一个t;结果就是我所需要的,看看sql profiler,但这看起来像是一个黑客行为;它可以改进吗?您可以从代码中删除一些冗余,但它是好的。您做对了。很高兴它能为您工作。