如何重构多个类似的Linq查询?

时间:2009-05-14 12:55:29

标签: c# .net linq linq-to-sql refactoring

假设我想要重构以下两个Linq查询:

var someValue1 = 0;
var someValue2= 0;
var query1 = db.TableAs.Where( a => a.TableBs.Count() > someValue1 )
                  .Take( 10 );
var query2 = db.TableAs.Where( a => a.TableBs.First().item1 == someValue2)
                  .Take( 10 );

请注意,只有Where参数更改。有什么方法可以将查询放在方法中并将Where参数作为参数传递?

4 个答案:

答案 0 :(得分:2)

有。 where参数只是类型Func<T, bool>的简单闭包(其中T是数据库项的类型 - 我不知道它们的代码),你可以将它包装成(匿名)函数。 / p>

Func<Func<T, bool>, IEnumerable<T>> MakeQuery = (Func<T, bool> whereParam) => db.TableAs.Where(whereParam).Take(10);

像这样使用

var query1 = MakeQuery(a => a.TableBS.Count() > someValue1);

答案 1 :(得分:2)

您可以使用Predicate<T>

public IQueryable<TableA> Helper(Predicate<TableA> predicate)
{
    return db.TableAs.Where(predicate).Take(10);
}

就这样称呼它。

var query1 = Helper(a => a.TableBs.Count() > someValue1);
var query2 = Helper(a => a.TableBs.First().item1 == someValue2);

并提供比Helper更好的名字。

答案 2 :(得分:1)

是的,参数类型是lambda表达式Func<TSource, bool>

Func<Person, bool> c1 = p => p.LastName == "1";
Persons.Where(c1);
Func<Person, bool> c2 = p => p.FirstName == "2";
Persons.Where(c2)

答案 3 :(得分:1)

你可以像重构任何其他代码那样做:

T MyQuery(U db, Func<TSource, bool> pred) {
  return db.TableAs.Where( pred )
                  .Take( 10 );
}

其中T和U是您查询中相关的任何类型。