gpt4 book ai didi

c# - 将字符串与 LINQ 中的项目 ID 相匹配

转载 作者:行者123 更新时间:2023-12-02 21:47:13 24 4
gpt4 key购买 nike

我有一个字符串:

strCheckedCategories = "2;"

代表 SharePoint 列表的 EntityList,项目 ID 为 1 到 21:

EntityList<VendorSearchesItem> vendorSearches = 
dataContext.GetList<VendorSearchesItem>("Vendor Searches");

LINQ 查询返回连接到“供应商搜索”列表的两个 SharePoint 列表中的字段:

var vendorSearchesQuery = (from s in vendorSearches
orderby s.VendorID.Title
select new
{
Vendor = s.VendorID.Title,
Website = s.VendorID.VendorWebsite,
VendorID = s.VendorID.Id,
SearchType = s.SearchTypeID.Title,
SearchTypeId = s.SearchTypeID.Id
});

另一个 LINQ 查询仅返回项目 ID 位于列表中的项目:

var q2 = from m2 in vendorSearchesQuery 
where strCheckedCategories.Contains(m2.SearchTypeId.ToString())
select m2

问题是,除了返回 ID 为 2 的项目(所需结果)之外,查询还返回 ID 为 12、20 和 21 的项目。我该如何解决这个问题?

最佳答案

因此,从根本上讲,您在这里要做的是使用一个 IN 子句,在该子句中为字段指定一堆值,并且您希望该列的值位于该集合中的行。

CAML 实际上有一个可以使用的 IN 子句,但遗憾的是 LINQ to Sharepoint 不提供任何生成 IN 子句的方法;查询提供程序根本不支持它。

您尝试使用一些技巧来通过尝试进行字符串比较而不是使用正确的运算符来解决该问题,并且您遇到了对所有操作进行字符串化的陷阱。它根本不适合这项任务。

正如我所说,由于您无法让 LINQ to SharePoint 使用 IN,因此一种选择就是不使用 LINQ,手动构建 CAML,然后使用标准服务器对象模型执行它。但这并不有趣。

我们可以做的是进行一系列的 OR 检查。我们将查看该列值是集合中所有值的第一个值、第二个值还是第三个值等。这实际上与 IN 子句相同,只是更加冗长。

现在这给我们带来了如何将未知数量的比较进行“或”运算的问题。如果是 AND,那就很容易了,我们只需在循环内调用 Where 即可对这 N 个子句进行 AND 运算。

相反,我们需要使用表达式。我们可以自己手动构建动态数量的 OR 子句的表达式树,然后查询提供程序将能够很好地解析它。

我们的新方法 WhereIn 会将查询过滤到给定属性值位于一组值中的所有项目,需要接受一个查询,即我们要查找的属性的属性选择器。正在使用,以及一组相同类型的值来进行比较。之后我们就可以简单地创建属性访问的比较表达式以及每个键值,然后对所有这些表达式进行“或”运算。

public static IQueryable<TSource> WhereIn<TSource, TKey>(
this IQueryable<TSource> query,
Expression<Func<TSource, TKey>> propertySelector,
IEnumerable<TKey> values)
{
var t = Expression.Parameter(typeof(TSource));
Expression body = Expression.Constant(false);
var propertyName = ((MemberExpression)propertySelector.Body).Member.Name;

foreach (var value in values)
{
body = Expression.OrElse(body,
Expression.Equal(Expression.Property(t, propertyName),
Expression.Constant(value)));
}

return query.Where(Expression.Lambda<Func<TSource, bool>>(body, t));
}

现在调用它,我们只需要查询、要过滤的属性和值的集合:

var q2 = vendorSearchesQuery.WhereIn(vendor => vendor.SearchTypeId
, strCheckedCategories.Split(';'));

瞧。

虽然我希望按原样工作,但您可能需要在Select之前调用WhereIn.对于已映射的 SearchTypeId,它可能无法正常工作。

关于c# - 将字符串与 LINQ 中的项目 ID 相匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19322760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com