c#传递lambda表达式字段到linq查询方法和使用字段
本文关键字:字段 方法 查询 传递 lambda 表达式 linq | 更新日期: 2023-09-27 18:05:07
如何将字段(通过lambda表达式)传递到方法中,然后使用该字段作为linq查询的一部分?
我想把这个方法命名为
IDictionary<string, string> stuff = foo(items, otherItems, otherItems => otherItems.FieldToUse)
我不确定如何编写该方法,但我希望像下面的代码那样使用它。我知道我可以使用泛型并将字段名(通过字符串)传递到方法中,但即使这样,我也不知道如何在linq查询中使用它,如下所示。另外,我喜欢使用lambda,因为我可以随时重命名字段。
private IDictionary<string, string> foo<TModel>(IEnumerable<string> items, IEnumerable<TModel> otherItems, object FieldToUse)
{
//this will return a list of key value pairs of rowIDs and equipment
IDictionary<string, string> x = (from o in otherItems
join i in items on o.FieldToUse.ToString() equals i //joining on the equipment assetcode
select new { rowID = o.RowID, item = i }).ToDictionary(k => k.rowID.ToString(), v => v.item);
return x;
}
说明:fielduse是TModel的属性或字段
使用Func Delegate
将方法foo中的最后一个参数更改为
Func<TModel, String> FieldToUse
和在LINQ查询中调用函数
FieldToUse(o)
这是整个方法foo
private IDictionary<string, string> foo<TModel>(IEnumerable<string> items,
IEnumerable<TModel> otherItems,
Func<TModel, String> FieldToUse)
{
//this will return a list of key value pairs of rowIDs and equipment
IDictionary<string, string> x = (from o in otherItems
join i in items on FieldToUse(o) equals i //joining on the equipment assetcode
select new { rowID = o.RowID, item = i })
.ToDictionary(k => k.rowID.ToString(), v => v.item);
return x;
}
你可以这样使用它
public void DoStuff()
{
string[] items = { "abc", "def", "ghi" };
List<Model> otherItems = new List<Model> {
new Model() { Field1 = "abc", Field2 = "xyz" },
new Model() { Field1 = "abc", Field2 = "xyz" } };
var result = foo<Model>(items, otherItems, a => a.Field2);
}
class Model
{
public string Field1 { get; set; }
public string Field2 { get; set; }
}
你会有另一个问题。通用TModel没有RowID。也许可以为TModel提供一个泛型的where约束。
代码变成
private IDictionary<string, string> foo<TModel>(IEnumerable<string> items,
IEnumerable<TModel> otherItems,
Func<TModel, String> FieldToUse) where TModel : BaseModel
{
//this will return a list of key value pairs of rowIDs and equipment
IDictionary<string, string> x = (from o in otherItems
join i in items on FieldToUse(o) equals i //joining on the equipment assetcode
select new { rowID = o.RowID, item = i })
.ToDictionary(k => k.rowID.ToString(), v => v.item);
return x;
}
class BaseModel
{
public int RowID { get; set; }
}
class Model : BaseModel
{
public string Field1 { get; set; }
public string Field2 { get; set; }
}