日期:2014-05-20  浏览次数:20840 次

求一lambda表达式
数据表结构如下图:一个Patient有多个ClinicalCase,一个ClinicalCase有多个Sample,一个Sample有多个SampleCustomTableRecord


下面是SampleCustomTableRecords的一些数据:
ID RecordIndex ... FK1 FK2 SampleID
1 1 NULL NULL NULL NULL 73 131 1
2 1 NULL NULL NULL NULL 74 163 1
3 1 NULL NULL NULL NULL 75 169 1
4 1 NULL NULL NULL aaa   76 NULL 1
5 2 NULL NULL NULL NULL 73 132 1
6 2 NULL NULL NULL NULL 74 167 1
7 2 NULL NULL NULL NULL 75 171 1
8 2 NULL NULL NULL 76 NULL 1
9 3 NULL NULL NULL NULL 73 131 1
10 3 NULL NULL NULL NULL 74 163 1
11 3 NULL NULL NULL NULL 75 171 1
12 3 NULL NULL NULL NULL 76 NULL 1
------------------------------------------
现在我想选出这样一些Samples(或ClinicalCases, 或Patients):
   RecordIndex相同的(condition1):FK1=73 and FK2=131 和 (condition2):FK1=75 and FK2=169。
由于condition有可能有很多,中间都是And关系,我想用动态创建Expression的方法实现。现在就是这个Expression不会写。难点是RecordIndex要相同,在SQL中可以用表自己join自己来实现。可怎么翻译成linq呢?如果能直接给出lambda表达式将不胜感激。



------解决方案--------------------
.Where<T>(Predicate) 是延迟执行的,可以利用它来拼凑多个条件
------解决方案--------------------
Expression<Func<TData, bool>> w = (data) => true;
w = (data) => w(data) && data.a == aaa; // where a = aaa
w = (data) => w(data) && data.b == bbb; // where a = aaa and b = bbb
w = (data) => w(data) 
------解决方案--------------------
 data.c == ccc; // where (a = aaa and b = bbb) or c = ccc
...
var query = from x in datasource where w(x);
------解决方案--------------------
引用:
在SQL中可以用表自己join自己来实现。可怎么翻译成linq呢?


var query=from  a in SampleCustomTableRecords
          join b in SampleCustomTableRecords
          on a.RecordIndex equals b.RecordIndex
          where  a.FK1==73 && a.FK2==131 && b.FK1==74 && b.FK2=163
          select a;

------解决方案--------------------
var query = ...
...
query = from x in query
        join y in anothertable
        on x.xxx equals y.yyy
        select xxx;