Lau*_*rin 6 c# linq entity-framework bigdata
我目前正在使用asp.net中的Web应用程序.在某些api调用中,有必要将ListA与ListB的列表进行比较,以确定ListA是否具有ListB中任何List的相同元素.换句话说:如果ListA包含在ListB中.
使用EF-Code-First数据库的Linq查询这两个集合.ListB有一个匹配的List或者没有,只有一个.在最坏的情况下,ListB有数百万个元素,因此比较需要是可扩展的.
而不是做嵌套的foreach循环,我正在寻找一个纯粹的linq查询,它将让db完成工作.(在考虑多列索引之前)
为了说明结构:
//In reality Lists are queried of EF
var ListA = new List<Element>();
var ListB = new List<List<Element>>();
List<Element> solution;
bool flag = false;
foreach (List e1 in ListB) {
foreach(Element e2 in ListA) {
if (e1.Any(e => e.id == e2.id)) flag = true;
else {
flag = false;
break;
}
}
if(flag) {
solution = e1;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
更新结构
由于它是一个EF数据库,我将提供相关的对象结构.我不确定我是否可以发布实际代码,所以这个例子仍然是通用的.
//List B
class Result {
...
public int Id;
public virtual ICollection<Curve> curves;
...
}
class Curve {
...
public int Id;
public virtual Result result;
public int resultId;
public virtual ICollection<Point> points;
...
}
public class Point{
...
public int Id;
...
}
Run Code Online (Sandbox Code Playgroud)
控制器(用于api-call)想要提供正确的Curve-Object.为了识别正确的对象,提供了一个过滤器(ListA)(实际上是一个曲线对象)现在需要将过滤器(ListA)与结果中的曲线列表(ListB)进行比较.比较曲线的唯一方法是通过比较两者都有.(因此事实上比较列表)曲线有大约1 - 50点.结果可以有大约500.000.000曲线
这里可以通过Object-Identity进行比较,因为所有对象(甚至是过滤器)都是对db的重新查询.
我正在寻找一种方法来实现这种机制,而不是如何解决这种情况.(例如,通过使用多列索引(更改表格))
(用于说明目的):
class controller {
...
public Response serveRequest(Curve filter) {
foreach(Curve c in db.Result.curves) {
if(compare(filter.points , c.points)) return c;
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用除了:
public static bool ContainsAllItems(IList<T> listA, IList<T> listB)
{
return !listB.Except(listA).Any();
}
Run Code Online (Sandbox Code Playgroud)
上面的方法将判断 listA 是否包含 listB 的所有元素..并且复杂度比 O(n*m) 方法快得多。
归档时间: |
|
查看次数: |
212 次 |
最近记录: |