gpt4 book ai didi

c# - Linq 联盟 : How to add a literal value to the query?

转载 作者:太空狗 更新时间:2023-10-30 01:10:25 29 4
gpt4 key购买 nike

我需要向查询中添加文字值。我的尝试

var aa = new List<long>();
aa.Add(0);
var a = Products.Select(p => p.sku).Distinct().Union(aa);

a.ToList().Dump(); // LinqPad's way of showing the values

在上面的例子中,我得到一个错误:

"Local sequence cannot be used in LINQ to SQL implementation
of query operators except the Contains() operator."

例如,如果我使用 Entity Framework 4,我可以向 Union 语句添加什么以始终包含“种子”ID?

我正在尝试生成如下所示的 SQL 代码:

select distinct ID
from product
union
select 0 as ID

所以稍后我可以加入列表本身,这样我就可以找到下一个最高值不存在的所有值(找到集合中最低的可用 ID)。

编辑:原始 Linq 查询以查找最低可用 ID

var skuQuery = Context.Products
.Where(p => p.sku > skuSeedStart &&
p.sku < skuSeedEnd)
.Select(p => p.sku).Distinct();

var lowestSkuAvailableList =
(from p1 in skuQuery
from p2 in skuQuery.Where(a => a == p1 + 1).DefaultIfEmpty()
where p2 == 0 // zero is default for long where it would be null
select p1).ToList();
var Answer = (lowestSkuAvailableList.Count == 0
? skuSeedStart :
lowestSkuAvailableList.Min()) + 1;

此代码创建两个偏移一个的 SKU 集,然后选择不存在下一个最高的 SKU。之后,它会选择其中的最小值(下一个最高可用的最低 SKU)。

为此,种子必须在集合中连接在一起。

最佳答案

您的问题是您的查询完全变成了 LINQ-to-SQL 查询,而您需要的是在其之上进行本地操作的 LINQ-to-SQL 查询。

解决方案是告诉编译器您希望处理查询后使用 LINQ-to-Objects(换句话说,更改扩展方法解析以查看 IEnumerable<T>,而不是 IQueryable<T>)。最简单的方法是将 AsEnumerable() 添加到查询的末尾,如下所示:

var aa = new List<long>();
aa.Add(0);
var a = Products.Select(p => p.sku).Distinct().AsEnumerable().Union(aa);

a.ToList().Dump(); // LinqPad's way of showing the values

关于c# - Linq 联盟 : How to add a literal value to the query?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4751924/

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