伙计们,我很难将下面的linq表达式(左连接实现)转换为lambda表达式(用于学习)。
var result = from g in grocery
join f in fruit on g.fruitId equals f.fruitId into tempFruit
join v in veggie on g.vegid equals v.vegid into tempVegg
from joinedFruit in tempFruit.DefaultIfEmpty()
from joinedVegg in tempVegg.DefaultIfEmpty()
select new { g.fruitId, g.vegid, fname = ((joinedFruit == null) ? string.Empty : joinedFruit.fname), vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) };
有人可以建议我怎么做。
如果有人给我“C#Lambdas& Linqs”的优秀教程链接,我真的很感激
答案 0 :(得分:26)
将Linq查询转换为它的等效Lambda:
答案 1 :(得分:12)
答案 2 :(得分:9)
这是我遵循的启发式方法:
当你有连接时,在lambdas上使用LINQ表达式。
我认为连接的lambdas看起来很乱,很难阅读。
答案 3 :(得分:8)
我通常使用ReSharper来帮助我将事物转换为方法链和lambda's,这有助于我来回走动。
var result = from g in grocery
join f in fruit on g.fruitId equals f.fruitId into tempFruit
join v in veggie on g.vegid equals v.vegid into tempVegg
from joinedFruit in tempFruit.DefaultIfEmpty()
from joinedVegg in tempVegg.DefaultIfEmpty()
select new { g.fruitId, g.vegid, fname = ((joinedFruit == null) ? string.Empty : joinedFruit.fname), vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) };
然后使用ReSharper将LINQ转换为方法链的选项等于以下内容:
var result =grocery .GroupJoin(fruit, g => g.fruitId, f => f.fruitId, (g, tempFruit) => new {g, tempFruit})
.GroupJoin(veggie, @t => @t.g.vegid, v => v.vegid, (@t, tempVegg) => new {@t, tempVegg})
.SelectMany(@t => @t.@t.tempFruit.DefaultIfEmpty(), (@t, joinedFruit) => new {@t, joinedFruit})
.SelectMany(@t => @t.@t.tempVegg.DefaultIfEmpty(),(@t, joinedVegg) =>
new
{
@t.@t.@t.g.fruitId,
@t.@t.@t.g.vegid,
fname = ((@t.joinedFruit == null) ? string.Empty : @t.joinedFruit.fname),
vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname)
});
当然,输出不太合乎需要,但它至少有助于在理解语法的某个地方开始。
答案 4 :(得分:4)
以下是在lambda中编写此查询的方法:
var customers = new List {
new Customer { CompanyId = “AC”, CustomerId = “Customer1” },
new Customer { CompanyId = “not-AC”, CustomerId = “Customer2” },
};
var userCustomers = new List {
new UserCustomer { CompanyId = “AC”, CustomerId = “Customer1”, User = “not-admin” },
new UserCustomer { CompanyId = “AC”, CustomerId = “Customer1”, User = “admin” },
new UserCustomer { CompanyId = “AC”, CustomerId = “Customer2”, User = “not-admin” },
new UserCustomer { CompanyId = “AC”, CustomerId = “Customer2”, User = “admin” },
new UserCustomer { CompanyId = “not-AC”, CustomerId = “Customer1”, User = “not-admin” },
new UserCustomer { CompanyId = “not-AC”, CustomerId = “Customer1”, User = “admin” },
new UserCustomer { CompanyId = “not-AC”, CustomerId = “Customer2”, User = “not-admin” },
new UserCustomer { CompanyId = “not-AC”, CustomerId = “Customer2”, User = “admin” }
};
使用查询表达式
var query =
from c in customers
join uc in userCustomers on
new { c.CompanyId, c.CustomerId } equals new { uc.CompanyId, uc.CustomerId }
where c.CompanyId == “AC” && uc.User == “admin“
select c;
使用lambda表达式
var lambda = customers.Where(c => c.CompanyId == “AC”) // inner sequence
.Join(userCustomers.Where(uc => uc.User == “admin”), // outer sequence
c => new { c.CompanyId, c.CustomerId }, // inner key selector
uc => new { uc.CompanyId, uc.CustomerId }, // outer key selector
(c, uc) => c);
这两种方法都会产生相同的结果(客户公司ID为“AC”,客户ID为“Customer1”),但正如您所见,lambda表达式更难写入和读取!
希望这有帮助!
答案 5 :(得分:3)
下载LINQPad;它内置了用于学习LINQ的示例。
答案 6 :(得分:3)
使用Reflector .NET:)