0

现在我有一堆使用 SqlConnections/StringBuilder/SqlDataReader 的数据访问方法。我正在尝试将其中一些移至实体框架。我有一个动态附加 where 子句的方法,例如:

sb.AppendLine(" WHERE ");
sb.AppendLine(" (@Value1 is null or Table1.Id = @Value1) " );
sb.AppendLine(" AND (@Value2 is null or Table2.Field = @Value2)" );
sb.AppendLine(" AND (@Value3 is null or Table3.Stuff = @Value3)" );

是否可以在 L2E 方法语法中复制此行为?我需要它可用于一堆不同的方法。这可以做成扩展方法吗?它如何处理从不同表中选择的不同查询?

4

2 回答 2

1

它可能看起来像这样:

var qry = db.SomeTable
            .Where(c => value1 == null || c.Table1.Id == value1)
            .Where(c => value2 == null || c.Table2.Field == value2)
            .Where(c => value3 == null || c.Table3.Stuff == value3);

更新 如何使其可供不同的查询访问?
如果通过其他查询-您的意思是其他实例,IQueryable<SomeTable>则可以使用扩展方法

public static class MyExtentions
{
   public static IQueryable<SomeTable> ApplyCondition(this IQueryable<SomeTable> source)
   {
      return source
               .Where(c => value1 == null || c.Table1.Id == value1)
               .Where(c => value2 == null || c.Table2.Field == value2)
               .Where(c => value3 == null || c.Table3.Stuff == value3);
   }
}

那么你可以这样称呼它:

var qry = db.SomeTable.ApplyCondition();
于 2013-11-06T14:19:29.803 回答
0

像这样,您可以在 tb1.Id = equals (@Value1==null?@Value1: tb1.Id) 上加入 Table1 中的 tb1。

于 2013-11-06T14:14:24.400 回答