可扩展的Linq查询

lau*_*ian 2 .net c# linq

我有一个复杂的查询,我在我的代码中多次使用.我用它来获取所有物品或只是一件物品:

from item in _db.Tests ... select getItem(item)
from item in _db.Tests ...  where item.Id == id select getItem(item)
Run Code Online (Sandbox Code Playgroud)

我不想重复使用公共部分,只有在实际使用它时才调用"getItem".

我试着创建一个这样的函数:

from item in _db.Tests ... 
Run Code Online (Sandbox Code Playgroud)

但编译器抱怨,因为我没有选择.

我还可以创建一个:

private IQueryable<Test> getTests()
{
    return from item in _db.Tests ... select item;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

from t in getTests() select getItem(t)
Run Code Online (Sandbox Code Playgroud)

但这可能无法利用LINQ能够实现的优化......对吗?

你能帮帮我吗?

编辑

我意识到我的问题更复杂:点(...)实际上是连接,getItem函数使用来自连接的信息并进行一些计算.

此外,我想有一个函数来获取所有项目和一个不同的项目以获取特定项目(我想隐藏查询逻辑与程序的其余部分).

我在想这样做:

private IQueryable<Tuple<Table1, Table2, Table3, Table4>> queryItems()
{
    return from t1 in _db.Table1s
           join t2 in _db.Table2s on t1.T2ID equals t2.ID into outerT2 from t2 in outerT2.DefaultIfEmpty()
           join t3 in _db.Table3s on t1.T3ID equals t3.ID into outerT3 from t3 in outerT3.DefaultIfEmpty()
           join t4 in _db.Table4s on t1.T4ID equals t4.ID into outerT4 from t4 in outerT4.DefaultIfEmpty()
           select new Tuple<Table1, Table2, Table3, Table4>(t1, t2, t3, t4);
}

public IEnumerable<Item> GetItems()
{
    return from i in queryItems()
           select getItem(i.Item1, i.Item2, i.Item3, i.Item4);
}

public Item GetItem(int id)
{
    return from i in queryItems()
           where i.Item1.ID equals id
           select getItem(i.Item1, i.Item2, i.Item3, i.Item4);
}
Run Code Online (Sandbox Code Playgroud)

我不想把getItem放在queryItems中因为它做了一些计算,而在GetItem(int id)的情况下,它会为每个元素运行它(对吗?).

这是一个很好的方式来完成这项工作吗?有更漂亮的方式吗?一种更有效的方式?

Ree*_*sey 6

您可以使用相同的查询,只需根据需要添加条件:

var items = from item in _db.Tests ... select getItem(item);

// Restrict as necessary
if (fetchSingle)
    items = items.Where(item => item.Id == id);
Run Code Online (Sandbox Code Playgroud)

将filter(Where)拆分为单独的调用将没有任何缺点,因为当您实际使用IQueryable<T>由于LINQ的延迟执行而产生的结果时,它将向服务器发送相同的查询.