2015-08-14 41 views
-1

我想加入基于ID列两个表上Table2是在IDTable1Ef6点符号;与条件colums加入喜欢,不等于

me.dbSet.Join(me.context.Table2, p => p.ID, e => e.ID, 
(p, e) => new { p, e }).Where(z => z.e.ID== uid) 

的SQL输出:

SELECT 
    1 AS [C1] 
    FROM [NG].[T1] AS [Extent1] 
    INNER JOIN [NG].[T2] AS [Extent2] ON [Extent1].[ID] = [Extent2].[ID] 
    WHERE [Extent2].[ID] = 'f520f7b3-215d-4dfe-9787-1eb6864fb335' 

我试图用linq写的sql:

SELECT 
    1 AS [C1] 
    FROM [NG].[T1] AS [Extent1] 
    INNER JOIN [NG].[T2] AS [Extent2] ON [Extent1].[ID] Like [Extent2].[ID] + '%' 
    WHERE [Extent2].[ID] = 'f520f7b3-215d-4dfe-9787-1eb6864fb335' 

回答

2

您可以与where子句中交叉联接和StartsWith做到这一点:

var data = from t1 in Table1 
      from t2 in Table2 
      where t1.Id.StartsWith(t2.Id) 
      && t2.Id == uid 
      select new { t1, t2 }; 

它不会给予同样的SQL,只要你想,但输出是一样的。只有

未经检验的,但使用lambda扩展方法,这应该工作:

var data = me.dbSet 
    .Join(
     me.context.Table2, 
     p => true, 
     e => true, 
     (p, e) => new { p, e }) 
    .Where(z => z.e.ID == uid && z.p.Id.StartsWith(z.e.Id)); 

另一个潜在的选择,如果你知道ID的长度是不变的(它看起来像一个GUID,所以你也许可以依靠它长为36个字符:

var data = me.dbSet 
    .Join(
     me.context.Table2, 
     p => p.Id.Substring(0, 36), 
     e => e.Id, 
     (p, e) => new { p, e }) 
    .Where(z => z.e.ID == uid); 
+0

是更多钞票来用点表示写这 – semirturgay

+0

检查编辑,未经测试,但应该工作 – DavidG

+0

首先为您解答所有thaks的它的工作原理,但它是在很慢?。与'table1.id +'%''加入table1.id相比因为它加入了'on 1 = 1'表,然后过滤记录。我正在用一个拥有超过100万条记录的大数据集来测试它。 – semirturgay